如果我们比较通过将dir()
内置函数应用于对象超类生成的列表和'dummy',无体类,例如
class A():
pass
我们发现A类有三个属性('__dict__', '__module__' and '__weakref__')
,它们不存在于对象类中。
A类从哪里继承这些附加属性?
答案 0 :(得分:8)
__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:
相当于Python3的class C(object):
。对于Python2,普通class C:
将生成没有__weakref__
的实例(或从object
实现中获取的许多其他属性)。