正确使用字典的getter/setter方法

编程入门 行业动态 更新时间:2024-10-26 03:26:26
本文介绍了正确使用字典的getter/setter方法的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧! 问题描述

我对Python还是很陌生,所以如果这里有什么不好的事情,请指出.

I'm pretty new to Python, so if there's anything here that's flat-out bad, please point it out.

我有一个带有此字典的对象:

I have an object with this dictionary:

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

每个特征的值应为1到10的整数,并且不应添加新的特征.我要使用getter/setter,所以我可以确保保留这些约束.这是我现在制作吸气剂和吸气剂的方法:

The value for each trait should be an int in the range 1-10, and new traits should not be allowed to be added. I want getter/setters so I can make sure these constraints are being kept. Here's how I made the getter and setter now:

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

我在此网站上阅读了有关property()方法的信息.但是我没有找到一种简单的方法来利用它来获取/设置字典中的值.有一个更好的方法吗?理想情况下,我希望此对象的用法为obj.traits['happy'] = 14,它将调用我的setter方法并由于14超过10而抛出ValueError.

I read on this website about the property() method. But I don't see an easy way to make use of it for getting/setting the values inside the dictionary. Is there a better way to do this? Ideally I would like the usage of this object to be obj.traits['happy'] = 14, which would invoke my setter method and throw a ValueError since 14 is over 10.

推荐答案

如果您愿意使用obj['happy'] = 14这样的语法,则可以使用__getitem__和__setitem__:

If you are willing to use syntax like obj['happy'] = 14 then you could use __getitem__ and __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__(请参见下文).

If you really do want obj.traits['happy'] = 14 then you could define a subclass of dict and make obj.traits an instance of this subclass. The subclass would then override __getitem__ and __setitem__ (see below).

PS.要继承dict的子类,请同时继承collections.MutableMapping和dict.否则,dict.update不会调用新的__setitem__.

PS. To subclass dict, inherit from both collections.MutableMapping, and dict. Otherwise, dict.update would not call the new __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]

更多推荐

正确使用字典的getter/setter方法

本文发布于:2023-05-27 09:56:59,感谢您对本站的认可!
本文链接:https://www.elefans.com/category/jswz/34/285751.html
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
本文标签:词库加载错误:Could not find file &#039;D:\淘小白 高铁采集器win10\Configuration\Dict_Sto

发布评论

评论列表 (有 0 条评论)
草根站长

>www.elefans.com

编程频道|电子爱好者 - 技术资讯及电子产品介绍!