类从哪里获得默认的'__dict__'属性?

时间:2013-05-12 23:23:14

标签: python class

如果我们比较通过将dir()内置函数应用于对象超类生成的列表和'dummy',无体类,例如

class A():
    pass

我们发现A类有三个属性('__dict__', '__module__' and '__weakref__'),它们不存在于对象类中。

A类从哪里继承这些附加属性?

1 个答案:

答案 0 :(得分:8)

  • __dict__属性由type.__new__中的内部代码创建。该类的元类可能会影响__dict__的最终内容。如果您使用的是__slots__,则您将没有__dict__属性。

  • 在编译类时设置了
  • __module__,因此实例从类继承此属性。您可以通过执行测试inst.__module__ is cls.__module__(假设instcls的实例),并修改cls.__module__并观察inst.__module__反映来验证这一点这种变化。

    (你也可以做一些愚蠢的事情,例如将inst.__module__设置为与cls.__module__不同的值。不确定为什么这不是一个只读属性。)

  • 实例是
  • __weakref__; AFAIK完全由内部CPython对象创建系统控制。此属性仅出现在object子类的实例上 - 例如intlistsettuple的实例没有__weakref__属性。

    在解释此解释时,请记住,class C:相当于Python3的class C(object):。对于Python2,普通class C:将生成没有__weakref__的实例(或从object实现中获取的许多其他属性)。