Python 数据模型为每个类定义了很多属性,参见标准库参考中“Built-in Types”一章的“4.13. Special Attributes”一节(https://docs.python.org/3/library/stdtypes.html#special-attributes)。其中三个属性在本书中已经见过多次:__mro____class____name__。此外,还有以下属性。

cls.__bases__

  由类的基类组成的元组。

cls.__qualname__

  Python 3.3 新引入的属性,其值是类或函数的限定名称,即从模块的全局作用域到类的点分路径。例如,在示例 21-6 中,内部类 ClassTwo__qualname__ 属性,其值是字符串 'ClassOne.ClassTwo',而 __name__ 属性的值是 'ClassTwo'。这个属性的规范是“PEP 3155—Qualified name for classes and functions”(https://www.python.org/dev/peps/pep-3155/)。

cls.__subclasses__()

  这个方法返回一个列表,包含类的直接子类。这个方法的实现使用弱引用,防止在超类和子类(子类在 __bases__ 属性中储存指向超类的强引用)之间出现循环引用。这个方法返回的列表中是内存里现存的子类。

cls.mro()

  构建类时,如果需要获取储存在类属性 __mro__ 中的超类元组,解释器会调用这个方法。元类可以覆盖这个方法,定制要构建的类解析方法的顺序。

 dir(...) 函数不会列出本节提到的任何一个属性。

我们对类元编程的学习到此结束。这是个很大的话题,我只讲了皮毛。因此,本书各章都有“延伸阅读”一节。