制作__dict__属性

时间:2017-07-25 17:17:14

标签: python datamodel bunch

为什么这样做:

class Bunch(dict):

    def __init__(self, *args, **kwargs):
        super(Bunch, self).__init__(*args, **kwargs)
        self.__dict__ = self

b = Bunch()
b["a"] = 1
print(b.a)

虽然有一个循环引用:

import sys
print(sys.getrefcount(b))
# ref count is 3 when normally it is 2

但不是这样:

class Bunch(dict):

    @property
    def __dict__(self):
        return self

b = Bunch()
b["a"] = 1
b.a

# raises AttributeError

虽然__dict__是大多数外观的属性,但是在幕后实现了一些特殊行为,绕过property创建的描述符逻辑。

1 个答案:

答案 0 :(得分:2)

默认__dict__属性已经基本 属性。 (它不是字面上的property,而是通过描述符协议实现的,就像property一样。)

当你设置self.__dict__ = self时,它会通过__dict__描述符的__set__方法并替换用于实例属性的字典。

但是,Python在执行属性操作时不使用__dict__描述符来查找实例dict;它使用不同的内部机制。因此,在第二个示例中,创建自己的__dict__描述符不会影响b.a的属性查找机制。