为什么自定义Python类实例的`__dict__`属性是类的描述符,而不是实例的实际属性?

时间:2017-10-05 00:02:29

标签: python python-3.x

来自https://stackoverflow.com/a/44880260/156458

  

请注意,自定义Python类实例的__dict__属性是   一个descriptor;该   实例本身没有属性,它就是类   提供它(所以   返回type(instance).__dict__['__dict__'].__get__(instance))。   可能存在object.__dict__,但object.__dict__['__dict__']可以   不

为什么自定义Python类实例的__dict__属性是类的描述符,而不是实例的实际属性?

2 个答案:

答案 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机制之一,具有这种神奇的属性查找功能。