来自https://stackoverflow.com/a/44880260/156458
请注意,自定义Python类实例的
__dict__
属性是 一个descriptor;该 实例本身没有属性,它就是类 提供它(所以 返回type(instance).__dict__['__dict__'].__get__(instance)
)。 可能存在object.__dict__
,但object.__dict__['__dict__']
可以 不
为什么自定义Python类实例的__dict__
属性是类的描述符,而不是实例的实际属性?
答案 0 :(得分:7)
很有诱惑力地说__dict__
必须是描述符,因为将其作为__dict__
条目实施会要求您在找到__dict__
之前找到__dict__
{1}},但是当查找其他属性时,Python已经绕过正常的属性查找以查找__dict__
,因此它不像最初的声音那样引人注目。如果每个'__dict__'
中的__dict__
键都替换了描述符,那么__dict__
仍然可以找到。
由于每个'__dict__'
都没有__dict__
的密钥,因此节省了一些空间,但这不是重要原因。通过不必设置'__dict__'
键来节省时间,并且通过不创建循环引用节省了时间和空间,并且这些好处都非常好,但它们仍然可能更小而不是下一件事。
要求__dict__
成为描述符的重要事情是处理重新分配或删除对象__dict__
的尝试。如果__dict__
的属性查找通过__dict__
键,则重新分配someobj.__dict__
将重新分配dict键,而不会更改Python实际查找的内容以查找someobj
'的属性。 __dict__
需要是描述符,因此它与Python查找对象的dict的实际C级结构槽保持同步。
答案 1 :(得分:1)
因为它是允许实例具有自定义属性的属性。这是通常存储实例的新自定义属性的位置。需要一些魔术来避免循环引用(您不希望在实例上查找__dict__
以在该实例上查找__dict__
。类描述符是两种Python机制之一,具有这种神奇的属性查找功能。