2013-07-31 2 views
1

У меня есть небольшой тест, чтобы полностью понять метакласс в python.Почему у метакласса есть тип?

class Test(object): 
    pass 


print Test.__class__ 
print Test.__class__.__class__ 
print Test.__class__.__class__.__class__ 

Все результаты одинаковы type. но каждый из их адресов не одинаковый.
Я не могу понять, почему метакласс рекурсивно имеет метакласс.
Объясните мне пожалуйста?

ответ

2

На самом деле, адреса совпадают:

>>> id(Test.__class__) 
6384576 
>>> id(Test.__class__.__class__) 
6384576 
>>> id(Test.__class__.__class__.__class__) 
6384576 

Все является объектом в Python, и каждый объект должен имеют класс (он должен принадлежать некоторому типу). Вы можете получить доступ к этой ссылке класса/типа по __class__ атрибуту, например:

>>> (1).__class__ 
<type 'int'> 

Все включает сами классы, которые имеют класс/типа называется type:

>>> (1).__class__.__class__ 
<type 'type'> 

В то же время type 'type'> также объект и должен ссылаться на некоторый класс/тип. Но так как это своего рода особый объект, его атрибут __class__ относится к себе:

>>> (1).__class__.__class__.__class__ is (1).__class__.__class__ 
True 
+0

Спасибо, я не понял их дополнение ress не то же самое. –

0

Когда вы Test.__class__, вы получите обратно тип Test, который type (потому что Test это идентификатор класса).

type сам снова идентификатор класса, так что вы можете назвать __class__ (который наследуется от object) на него, и вы получите ответ, что его тип, опять же, type, потому что это идентификатор класса.

Поскольку вы всегда будете возвращаться type, который является самим классом, вы можете делать это бесконечно много раз и всегда будете возвращаться к типу текущего объекта type.

0

Все классы классов означает, что они являются производными от класса называется класс ...

0

Все объекты класса питона строится при помощи встроенного в функции типа(). Вы также можете попробовать это.

>>> T.__class__ == type 
True 
>>> type(type) 
<type 'type'> 

Т. класса равно сборки в тип функции, которая также является объект реализован вызова функцию. Это атрибут будет интерпретироваться как класс (T). Поскольку ваш класс T не имеет базового класса, используется тип(), который возвращает объект типа.

Вы можете проверить документ python около customizing class creation, чтобы получить подробную информацию о создании класса.

Для определения соответствующего метакласса

  • если нет оснований и никакого явного метакласса задан, то типа() используется
  • , если явный метакласс дается, и это не является экземпляр типа() , то он используется непосредственно как метакласс
  • если экземпляр типа() задаются в качестве явного метакласса, или основы определены, то наиболее полученного метаклассом используется
Смежные вопросы