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