gpt4 book ai didi

python __dict__

转载 作者:太空狗 更新时间:2023-10-30 01:56:47 27 4
gpt4 key购买 nike

属性 __dict__ 应该包含用户定义的属性。但是如果我们打印一个空类的 __dict__,我也会得到:

__module__
__dict__
__weakref__
__doc__

Python 根据类对象类型在 __dict__ 属性中预填充。

现在,__base____class__ 也是 Python 定义的类对象类型的属性,但不包含在 __dict__ 中。

是否有任何规则指定对象 __dict__ 中包含哪些 dunder 属性,哪些不包含?

最佳答案

The attribute __dict__ is supposed to contain user defined attributes.

不,__dict__ 包含对象的动态属性。然而,对象的类型并不是唯一可以具有的属性,通常也会引用对象的类型来查找属性。

例如,类的方法也可以作为实例的属性找到。许多这样的属性是 descriptor objects并且在查找时绑定(bind)到对象。这是 __getattribute__ 方法的工作,所有类都继承自 object;对象的属性通过 type(object).__getattribute__(attribute_name) 解析,此时类型的描述符以及直接在对象上设置的属性(在 __dict__映射)被考虑。

类的__bases__属性由类元类型提供,默认为type();它是一个描述符:

>>> class Foo:
... pass
...
>>> Foo.__bases__
(<class 'object'>,)
>>> type.__dict__['__bases__']
<attribute '__bases__' of 'type' objects>
>>> type.__dict__['__bases__'].__get__(Foo, type)
(<class 'object'>,)

__dict__ 恰好是存储可以具有任何有效字符串名称的属性的地方。对于包含在创建类时设置的几个标准属性的类(__module____doc__),以及其他作为类实例的描述符的类(__dict__ __weakref__)。后者必须添加到 ,因为类本身也有那些属性,取自 type,再次作为描述符。

那么为什么 __bases__ 是描述符,而 __doc__ 不是呢?您不能将 __bases__ 设置为任何值,因此描述符 setter 会检查特定条件并提供重建内部缓存的机会。 Python 核心开发人员使用描述符来限制可以设置的内容,或者在设置值时需要额外的工作(例如验证和更新内部结构)。

关于 python __dict__,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48029249/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com