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

Tim*_*Tim 1 python python-3.x

来自/sf/answers/3141618231/

请注意,__dict__自定义Python类实例的属性是描述符 ; 实例本身没有属性,它是提供它的类(因此 type(instance).__dict__['__dict__'].__get__(instance)返回). object.__dict__可能存在,但object.__dict__['__dict__']不存在.

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

use*_*ica 7

很可能会说它__dict__必须是一个描述符,因为__dict__将它作为一个条目实现会要求你在找到它__dict__之前找到它__dict__,但是Python已经绕过了正常的属性查找,以便__dict__在查找其他属性时查找,所以这并不像它最初听起来.如果每个描述符都被一个'__dict__'键替换__dict__,__dict__那么仍然可以找到.

还有通过没有一键一些节省空间'__dict__'的每一个__dict__,但是这不是很大的原因.通过不设置'__dict__'密钥节省了时间,并且通过不创建循环引用节省了时间和空间,并且这些好处都非常好,但它们仍然可能比下一个更小.

需要__dict__成为描述符的重要事情是处理重新分配或删除对象的尝试__dict__.如果属性查找__dict__通过一个__dict__键,那么重新分配someobj.__dict__将重新分配dict键而不改变Python实际查找的dict以查找someobj属性.__dict__需要成为描述符,以便它与Python查找对象的dict的实际C级结构槽保持同步.