7

如果我们将通过将dir()内置函数应用于对象超类和“虚拟”无主体类生成的列表进行比较,例如

class A():
    pass

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

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

4

1 回答 1

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:相当于class C(object):Python3。对于 Python2,plainclass C:将生成没有 __weakref__(或从实现中获取的许多其他属性object)的实例。

于 2013-05-13T05:10:43.490 回答