Изменить:
Я не думаю, что это настоящий дубликат Что такое метаклассы в 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