从https://stackoverflow.com/a/44880260/156458开始
注意,定制Python类示例的__dict__
属性是descriptor;示例本身没有属性,它是提供属性的类(因此返回type(instance).__dict__['__dict__'].__get__(instance)
)。object.__dict__
可能存在,但object.__dict__['__dict__']
不存在。
为什么自定义Python类示例的__dict__
属性是类的描述符,而不是示例的实际属性?
2条答案
按热度按时间2vuwiymt1#
很容易认为
__dict__
必须是一个描述符,因为将它实现为__dict__
条目需要在找到__dict__
之前找到__dict__
,但是Python已经绕过了正常的属性查找,在查找其他属性时找到__dict__
。所以这并不像最初听起来那么有说服力,如果在每个__dict__
中用'__dict__'
键替换描述符,__dict__
仍然可以找到。在每个
__dict__
中没有'__dict__'
的键可以节省一些空间,但这不是主要原因,还有不需要设置'__dict__'
键节省的时间,不创建循环引用节省的时间和空间,这些好处都很好,但它们仍然可能比下一个要小。需要
__dict__
作为描述符的最重要的事情是处理重新分配或删除对象的__dict__
的尝试。如果__dict__
的属性查找通过__dict__
键进行,则重新分配someobj.__dict__
将重新分配dict键,而不改变dictPython实际查找someobj
的属性的内容。__dict__
需要是一个描述符,这样它才能与Python查找对象的dict时所使用的实际C级结构体槽保持同步。swvgeqrz2#
因为它是允许示例拥有自定义属性的属性,它是一个示例的新的自定义属性通常被存储的地方,需要一些魔法来避免循环引用(你不会想在一个示例上查找
__dict__
来找到那个示例上的__dict__
),类描述符是两个Python机制之一,具有这种魔法来查找示例属性。