如果我们将通过将dir()
内置函数应用于对象超类和“虚拟”无主体类生成的列表进行比较,例如
class A():
pass
我们发现 A 类具有('__dict__', '__module__' and '__weakref__')
对象类中不存在的三个属性。
A 类从哪里继承这些附加属性?
该__dict__
属性由 中的内部代码创建type.__new__
。类的元类可能会影响__dict__
. 如果你使用__slots__
,你将没有__dict__
属性。
__module__
在编译类时设置,因此实例从类继承此属性。您可以通过执行测试inst.__module__ is cls.__module__
(假设它inst
是 的一个实例cls
)来验证这一点,也可以通过修改cls.__module__
和观察inst.__module__
反映此更改的内容来验证这一点。
(你也可以做一些愚蠢的事情,比如设置inst.__module__
一个与 不同的值cls.__module__
。不知道为什么这不是一个只读属性。)
__weakref__
在实例存在时创建;AFAIK 它完全由内部 CPython 对象创建系统控制。此属性仅存在于object
子类的实例上——例如int
, list
,set
的实例tuple
没有__weakref__
属性。
在解释这个解释时,请记住这class C:
相当于class C(object):
Python3。对于 Python2,plainclass C:
将生成没有 __weakref__
(或从实现中获取的许多其他属性object
)的实例。