gpt4 book ai didi

python - 正确使用字典值的 getter/setter

转载 作者:太空狗 更新时间:2023-10-29 18:03:20 28 4
gpt4 key购买 nike

我是 Python 的新手,所以如果这里有任何明显不好的地方,请指出。

我有这个字典的对象:

traits = {'happy': 0, 'worker': 0, 'honest': 0}

每个特征的值应该是 1-10 范围内的整数,并且不允许添加新特征。我想要 getter/setter,这样我就可以确保这些约束得到保留。下面是我现在如何制作 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。

最佳答案

如果您愿意使用像 obj['happy'] = 14 这样的语法,那么您可以使用 __getitem____setitem__:

def __getitem__(self, key):
if key not in self.traits.keys():
raise KeyError
...
return traits[key]

def __setitem__(self, key, value):
if key not in self.traits.keys():
raise KeyError
...
traits[key] = value

如果你真的想要 obj.traits['happy'] = 14 那么你可以定义一个 dict 的子类并制作 obj.traits 这个子类的一个实例。然后子类将覆盖 __getitem____setitem__(见下文)。

附言。要子类化 dict,请继承 collections.MutableMappingdict。否则,dict.update 不会调用新的 __setitem__

import collections
class TraitsDict(collections.MutableMapping,dict):
def __getitem__(self,key):
return dict.__getitem__(self,key)
def __setitem__(self, key, value):
value = int(value)
if not 1 <= value <= 10:
raise ValueError('{v} not in range [1,10]'.format(v=value))
dict.__setitem__(self,key,value)
def __delitem__(self, key):
dict.__delitem__(self,key)
def __iter__(self):
return dict.__iter__(self)
def __len__(self):
return dict.__len__(self)
def __contains__(self, x):
return dict.__contains__(self,x)

class Person(object):
def __init__(self):
self.traits=TraitsDict({'happy': 0, 'worker': 0, 'honest': 0})

p=Person()
print(p.traits['happy'])
# 0

p.traits['happy']=1
print(p.traits['happy'])
# 1

p.traits['happy']=14
# ValueError: 14 not in range [1,10]

关于python - 正确使用字典值的 getter/setter,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7760916/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com