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

ztigrdn8  于 2022-12-21  发布在  Python
关注(0)|答案(2)|浏览(162)

https://stackoverflow.com/a/44880260/156458开始
注意,定制Python类示例的__dict__属性是descriptor;示例本身没有属性,它是提供属性的类(因此返回type(instance).__dict__['__dict__'].__get__(instance))。object.__dict__可能存在,但object.__dict__['__dict__']不存在。
为什么自定义Python类示例的__dict__属性是类的描述符,而不是示例的实际属性?

2vuwiymt

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级结构体槽保持同步。

swvgeqrz

swvgeqrz2#

因为它是允许示例拥有自定义属性的属性,它是一个示例的新的自定义属性通常被存储的地方,需要一些魔法来避免循环引用(你不会想在一个示例上查找__dict__来找到那个示例上的__dict__),类描述符是两个Python机制之一,具有这种魔法来查找示例属性。

相关问题