属性__dict__
应该包含用户定义的属性。但是如果我们打印__dict__
一个空的类,我还会得到:
__module__
__dict__
__weakref__
__doc__
哪些是由 Python 预先填充的__dict__
相应于类对象类型的属性。
Now, __base__
and __class__
也是 Python 定义的类对象类型的属性,但不包含在__dict__
.
是否有任何规则指定对象中包含哪个 dunder 属性__dict__
哪些不是?
属性__dict__
应该包含用户定义的属性。
No, the __dict__
包含动态属性一个物体的。这些并不是对象可以拥有的唯一属性,但是type通常还参考对象的属性来查找属性。
例如,类上的方法也可以作为实例上的属性找到。许多这样的属性是描述符对象 https://docs.python.org/3/howto/descriptor.html并且是bound抬头时看到物体。这是__getattribute__
所有类都继承自的方法object
;对象的属性通过以下方式解析type(object).__getattribute__(attribute_name)
,此时类型的描述符以及直接在对象上设置的属性(在__dict__
映射)被考虑。
The __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__
and __doc__
),以及其他作为类实例描述符的(__dict__
and __weakref__
)。后者必须添加到class,因为类本身也具有这些属性,取自type
,再次作为描述符。
那么为什么是__bases__
一个描述符,但是__doc__
不是?你无法设置__bases__
任何东西,因此描述符设置器检查特定条件,并且是重建内部缓存的机会。 Python 核心开发人员使用描述符来限制可以设置的内容,或者设置值需要额外的工作(例如验证和更新内部结构)。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)