为什么元类上的 .mro() 具有不同的签名? `'type' 对象的描述符 'mro' 需要一个参数`

Why does .mro() on a metaclass have a different signature? `descriptor 'mro' of 'type' object needs an argument`

在 Python 中的大多数 types/classes 上,我可以调用 .mro() 而无需参数。但不是 type 及其后代:

In [32]: type(4).mro()
Out[32]: [int, object]

In [33]: type(type(4)).mro()
---------------------------------------------------------------------------
TypeError                                 Traceback (most recent call last)
<ipython-input-33-48a6f7fcd2fe> in <module>()
----> 1 type(type(4)).mro()

TypeError: descriptor 'mro' of 'type' object needs an argument

看来我可以用 type(type(4)).mro(type(4)) 得到我想要的东西,但为什么我不能像在其他地方那样直接调用 mro()

因为 mro 是 metaclass 的一个方法,它需要一个实例——即 class ——,很像普通的 class C 和方法 m 你可以调用 C.m(inst)inst.m(),但你不能调用 C.m(),因为它需要 self 参数.

如果你想用元class或type本身调用mro,你可以使用type.mro(type).