2015-12-18 5 views
4

В большинстве типов/классов в Python я могу вызвать .mro() без аргументов. Но не на type и его потомков:Почему у metro() на метаклассе есть другая подпись? `descriptor '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() прямо как я в другом месте?

ответ

4

Поскольку mro является метод метакласса и нуждается экземпляр - то есть класс -, довольно много, как дали обычный класс C и метод m можно назвать C.m(inst) или inst.m(), но вы не можете позвонить C.m(), так как он ожидает аргумент self.

Если вы хотите позвонить в mro с метком или type, вы можете использовать type.mro(type).

+0

Хм, я вижу. Но 'type' также является экземпляром' type' ...! Смешение. – gerrit

+0

Точно так же, как 'object' и' type' являются экземплярами друг друга. Это не похоже на то, что интерпретатор использует 'type' для создания' type' или 'object'. Они являются «элементарными» классами, жестко закодированными в интерпретаторе. –

+0

Я полагаю, что другая путаница заключалась в том, что я считал, что «mro» является классом, потому что я назвал его классом. – gerrit