为什么 `object` 是 `type` 的实例而 `type` 是 `object` 的实例?

Why is `object` an instance of `type` and `type` an instance of `object`?

我对 Python 中的 objecttype class 有点困惑 3. 也许有人可以消除我的困惑或提供一些额外的信息.

我目前的理解是,每个 class(object 除外)都继承自一个名为 object 的基 class。但是每个class(包括object)也是class的一个实例type,它是它自己和object的一个实例,也继承自object.

我的问题是:

我尝试在 Python 标准库的文档中查找 objecttype 的条目。

每个 class(对象除外)都继承自对象。

>>> 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'>,)

每个 class 都是 class 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

<class 'type'>是classobject的metaclass,每个class(包括type)都直接或间接继承来自 object.

如果您需要找到更多关于 metaclasses 的信息,请查看此处 https://realpython.com/python-metaclasses/

您所有问题的答案都可以在本书中找到:Python Types and Objects

更新:another link to the book。如果它也死了,请告诉我。

回答问题最重要的部分:

  • 一个对象的type/class是否也是一个对象本身?

是的,根据第 1 章的规则 1:

“一切都是对象...我们定义的任何 class 都是对象,当然,那些 class 的实例也是对象。”

  • classobjecttype哪个才是真正的基地?

来自第 2 章:

“这两个对象是Python中的原始对象。我们不妨一次引入一个,但这会导致先有鸡还是先有蛋的问题——先引入哪个?这两个对象是相互依存 - 它们不能独立存在,因为它们是根据彼此定义的。"

Luciano Ramalho 在他的书“Fluent Python”中也说这种关系无法在 Python(第 21 章)中表达:

”classes对象和类型有一个独特的关系:对象是一个 类型的实例,类型是对象的子class。这种关系 是“魔法”:它不能用 Python 表示,因为 class 会 必须先存在,然后才能定义另一个。类型是的事实 自身的实例也很神奇。"

所以,对于你的问题:

  • class(类型)如何成为其自身的实例?

卢西亚诺说Python也不能表达

  • 是否可以说明对象与类型之间的关系class?

非常感谢在第 3 章制作此插图的作者:

根据Python Data Model,Python中的一切都是对象,每个对象都有一个身份、一个类型和一个值。

object是所有对象的基础class,type也是一个对象,所以它是object的一个实例,[=10也一样=] 本身。另外 type 是所有对象类型的基础 class,因此 object 的类型是 typetype 本身也是如此。

这是我的理解,欢迎指出错误。

我意识到它与 Java

中的 instanceKlass 和 _java_mirror 非常相似