我一直在阅读有关重写getattr和setattr的内容,如果我在构造函数中使用self .__ dict__ = 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
答案 0 :(得分:1)
当您希望在类用户获取或设置属性时执行额外操作时,可以覆盖getattr和setattr。例如:
1)当用户操纵无效属性时,您可能会避免引发异常,因此您只需为未知属性返回None。
2)实际上转发/委托属性操作,因此事先不知道有效属性,例如,表示数据库行的用户,用户将列作为属性进行操作。我需要运行时检查给定的属性名称是否与列名匹配,也许我想原谅大写/小写差异等。
另一方面,遏制有时优于子类化。您可以创建一个包含字典的类,而不是从字典继承。