我对Python还不太熟悉,所以如果这里有什么不好的地方,请指出。
我对这本词典有一个看法:
traits = {'happy': 0, 'worker': 0, 'honest': 0}
每个性状的值应该是1-10范围内的整数,并且不允许添加新性状。我想要getter/setter,这样我就可以确保这些约束被保留。下面是我如何做的一个盖特和塞特:
def getTrait(self, key):
if key not in self.traits.keys():
raise KeyError
return traits[key]
def setTrait(self, key, value):
if key not in self.traits.keys():
raise KeyError
value = int(value)
if value < 1 or value > 10:
raise ValueError
traits[key] = value
我在this website上读到关于property()
方法的文章。但我不认为有一种简单的方法可以利用它来获取/设置字典中的值。有更好的办法吗?理想情况下,我希望这个对象的用法是obj.traits['happy'] = 14
,这将调用我的setter方法并抛出一个ValueError,因为14大于10。
这样做的自然方法是使用对象而不是字典,并设置类“
__slots__
”。这样做的自然方法是使用对象而不是字典,这样您就可以编写属于类的getter/setter逻辑,并将它们包装为属性。由于所有这些属性都将以相同的方式工作,因此我们可以进行一些重构,以编写生成给定属性名的属性的代码。
以下可能是过度设计:
我首先想到了一些显而易见的建议:
.keys()
方法(而不是if key not in self.traits.keys()
使用if key not in self.traits
)。经过上述更改后,您的代码可能如下所示:
我没有彻底检查你的代码的正确性-可能还有其他问题。
如果您愿意使用
obj['happy'] = 14
这样的语法,那么可以使用__getitem__
和__setitem__
:如果您真的想要
obj.traits['happy'] = 14
,那么可以定义dict
的子类,并使obj.traits
成为该子类的实例。 然后子类将重写__getitem__
和__setitem__
(见下文)。另一方面,子类
dict
,继承自collections.MutableMapping
和dict
。否则,dict.update
将不会调用新的__setitem__
。相关问题 更多 >
编程相关推荐