Изменить: я не думаю, что это настоящий дубликат Что такое метаклассы в Python? хотя на мой вопрос частично ответ в самом конце длинного комментария.
Связанный вопрос касается метаклассов в целом. Мой вопрос о конкретном type
метакласса. И из того, что я знаю после прочтения ответов, метакласс type
не может быть реализован на чистом Python. Поэтому мой вопрос касается не только "Что такое метаклассы?", Более того, он касается отношения type
/object
и того, как метакласс может создавать себя, что реализуется путем "обмана" на уровне реализации.
Также для людей, которые не знакомы с концепцией метаклассов, оба вопроса кажутся совершенно не связанными.
Начальное сообщение:
Я немного сбит с толку насчет классов object
и type
в Python 3. Может быть, кто-то может прояснить мою путаницу или предоставить некоторую дополнительную информацию.
Мое текущее понимание:
Каждый класс (кроме object
) наследуется от базового класса, называемого object
. Но каждый класс ( в том числе object
) также является экземпляр класса type
, который является экземпляром себя и object
, а также наследует от object
. 😕😕😕
Мои вопросы:
-
Есть ли причина/проектное решение, почему
object
является экземпляромtype
аtype
наследуется отobject
? Должен лиtype
/класс объекта быть самим объектом? -
Как класс (
type
) может быть экземпляром самого себя? -
Какой из них является реальным
object
илиtype
базового класса?
Я всегда думал, чтоobject
будет самым "фундаментальным" классом, но, похоже, это экземплярtype
, который является экземпляромobject
, который является экземпляромtype
,... Где заканчивается эта рекурсия? -
Есть ли возможность проиллюстрировать связь между
object
иtype
класса?
Что я пробовал:
Я просмотрел записи object
и type
в Документации стандартной библиотеки Python.
Как это проверить:
Каждый класс (кроме объекта) наследуется от объекта.
>>> for x in object, int, float, str, list, dict:
... print(f'{x.__name__:6}: {x.__bases__}')
...
object: ()
int : (<class 'object'>,)
float : (<class 'object'>,)
str : (<class 'object'>,)
list : (<class 'object'>,)
dict : (<class 'object'>,)
Каждый класс является экземпляром класса type
.
>>> for x in object, int, float, str, list, dict:
... print(f'{x.__name__:6}: {x.__class__}')
...
object: <class 'type'>
int : <class 'type'>
float : <class 'type'>
str : <class 'type'>
list : <class 'type'>
dict : <class 'type'>
type
это экземпляр самого себя.
>>> type.__class__
<class 'type'>
type
также наследуется от object
.
>>> type.__bases__
(<class 'object'>,)
Также
>>> isinstance(object, type)
True
>>> isinstance(type, object)
True
>>> isinstance(type, type)
True
>>> isinstance(object, object)
True
>>> issubclass(type, object)
True
>>> issubclass(object, type)
False