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

时间:2015-12-18 15:20:14

标签: python metaclass method-resolution-order

在Python中的大多数类型/类中,我可以不带参数调用.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()

1 个答案:

答案 0 :(得分:5)

因为mro是元类的一个方法,它需要一个实例 - 即一个类 - ,就像给出一个普通的类C和一个方法m一样,你可以致电C.m(inst)inst.m(),但您无法致电C.m(),因为它需要self参数。

如果您想使用元类或mro本身来呼叫type,可以使用type.mro(type)