为什么元类上的 .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)
.
在 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)
.