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(...)函数不会列出本节提到的任何一个属性。
我们对类元编程的学习到此结束。这是个很大的话题,我只讲了皮毛。因此,本书各章都有“延伸阅读”一节。