使__dict__成为财产



为什么这样做:

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创建的描述符逻辑。

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

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

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

相关内容

  • 没有找到相关文章

最新更新