我一直在阅读关于重写getattr和setattr的内容,如果我使用self,就无法确定是否需要重写赋值。
有一次我举了个例子
a = OPT(foo='bar')
a.foo和一个[‘foo’]使用和不使用"getattr"和"setattr"声明。
如果我两者都需要,有人能解释一下吗?如果我这样做,为什么?谢谢!
class OPT(dict):
__getattr__ = dict.__getitem__
__setattr__ = dict.__setitem__
def __init__(self, *args, **kwargs):
super(OPT, self).__init__(*args, **kwargs)
self.__dict__ = self
设置self.__dict__ = self可能不是一个好主意。您试图用这个代码完成什么?
我以obj或类似dict的方式访问这个类,所以我可以做一个[‘bar’]或一个.bar。像这个帖子
问题是,如果有人做了a['keys'] = 2,他们会踩到听写的keys()方法,等等。
哈,我没想到。我以前见过这个实现。有很多关于它的帖子,但我不记得那个问题会出现。
@布伦巴恩的评论真的是这里的答案。
当你和你getattr重写setattr想给一些额外的类或集合when the user属性得到平安。for example:P></
1)你可能avoid manipulates安安当用户通过数据库属性返回INVALID,你只是不知道for an unknown属性。P></
2)属性是真的manipulations forwarded / delegated知道the valid属性,例如是not known that represents提前行级数据库和用户manipulates columns作为属性。的运行时间need to check if the given name column name属性matches,也许我喜欢和我的上/下的房屋,房屋等。P></
another thing is preferred to有时,子类的控制。inheriting instead of from a快译通,that contains类你可以在字典的创建。P></
如果我不打算这样做,我就不需要覆盖getattr和setattr了?在第一个示例中,我总是可以传递.get()的默认值。我不知道你第二点的例子是什么。
为了更清楚起见,编辑了第二个示例。