python getattr和setattr with self .__ dict__

我一直在阅读有关覆盖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

回答(1)

2 years ago

当您希望在类用户获取或设置属性时执行额外操作时,可以覆盖getattr和setattr . 例如:

1)当用户操作无效属性时,您可能会避免引发异常,因此您只需为未知属性返回None .

2)实际上转发/委托了属性操作,因此事先不知道有效属性,例如,表示数据库行的用户,用户将列作为属性进行操作 . 我需要运行时检查给定的属性名称是否与列名匹配,也许我想原谅大写/小写差异等 .

另一件事,遏制有时优于子类化 . 您可以创建一个包含dict的类,而不是从dict继承 .