python getattr和setattr with self .__ dict__

时间:2014-03-04 02:47:54

标签: python

我一直在阅读有关重写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 个答案:

答案 0 :(得分:1)

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

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

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

另一方面,遏制有时优于子类化。您可以创建一个包含字典的类,而不是从字典继承。