Python 3:为什么“对象”是“类型”的实例,而“类型”是“对象”的实例?

fel*_*nho 11 python oop metaprogramming object python-3.x

编辑: 我不认为这是Python什么是元类的真实副本,即使在长评论的结尾部分回答了我的问题。

链接的问题通常针对元类。我的问题是关于特定的元类的type。而且据我所知,阅读答案后,type无法在纯Python中实现元类。因此,我的问题不仅是关于“什么是元类?”,而且还涉及type/ object关系以及元类如何创建自身,这是通过在实现级别上“作弊”来实现的。

对于不熟悉元类概念的人来说,这两个问题似乎完全无关。


初始帖子:

我对Python 3中的objecttype类有些困惑。也许有人可以消除我的困惑或提供一些其他信息。

我目前的理解:

每个类(除外object)都从称为的基类继承object。但是每个类(包括object)也是该类的type一个实例,它是自身的实例,object并且也从继承object

我的问题:

  • 是否有一个原因/设计决定,为什么object是的实例typetype从中继承objecttype对象的/ class 是否也可以是对象本身?

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

  • 哪一个是真正的基类objecttype
    我一直认为object这将是最“基础”的类,但它似乎是的实例type,这是的实例object,是的实例type,...递归在哪里结束?

  • 是否有可能说明objecttype类之间的关系?

我试过的

我查找了Python标准库文档中的object和的条目type

如何检查:

每个类(对象除外)都从对象继承。

>>> 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'>,)
Run Code Online (Sandbox Code Playgroud)

每个类都是该类的一个实例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'>
Run Code Online (Sandbox Code Playgroud)

type 是它本身的一个实例。

>>> type.__class__
<class 'type'>
Run Code Online (Sandbox Code Playgroud)

type也从继承object

>>> type.__bases__
(<class 'object'>,)
Run Code Online (Sandbox Code Playgroud)

>>> isinstance(object, type)
True
>>> isinstance(type, object)
True
>>> isinstance(type, type)
True
>>> isinstance(object, object)
True
Run Code Online (Sandbox Code Playgroud)
>>> issubclass(type, object)
True
>>> issubclass(object, type)
False
Run Code Online (Sandbox Code Playgroud)

san*_*ash 6

您可以在本书中找到所有问题的答案:Python类型和对象

回答您问题的最重要部分:

  • 对象的类型/类也应该是对象本身吗?

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

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

  • 哪一个是真正的基类objecttype

从第2章开始:

“这两个对象是Python中的原始对象。我们可能一次也引入了它们,但这会导致鸡肉和鸡蛋问题-首先引入?这两个对象是相互依赖的-自从它们不能独立存在它们是彼此定义的。”

Luciano Ramalho在他的书“ Fluent Python”中也说过,这种关系不能用Python来表达(第21章):

“类的对象和类型具有独特的关系:对象是类型的实例,类型是对象的子类。这种关系是“魔术”的:它无法用Python表达,因为任何一个类都必须在另一个可以存在之前存在类型是其本身的实例这一事实也是不可思议的。”

因此,对于您的问题:

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

Luciano说它也不能用Python表达。

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

非常感谢在第3章中做了此插图的作者:

对象,类型和其他类之间的关系

  • @chepner你没有忘记每个类都是它自己的子类并且它对于“object”类来说并不特殊吗? (4认同)
  • “object”不是它自己的父级,因为“type”是它自己的类:object 是根,它没有父级。它是自身的子类,就像“类 C”是其自身的子类一样。“C 类”基数是“(object,)”,而对象基数是空的“()”,如问题文本中的打印所示。 (3认同)