python-3.x 为什么'object'是'type'的示例,而'type'是'object'的示例?

2q5ifsrm  于 2023-03-09  发布在  Python
关注(0)|答案(4)|浏览(162)

我对Python 3中的objecttype类有点困惑,也许有人可以澄清我的困惑,或者提供一些额外的信息。
我目前的理解是,每个类(除了object)都继承自一个名为object的基类,但每个类(包括object)也是type类的示例,type类是其自身和object的示例,也继承自object
我的问题是:

  • objecttype的示例,而type继承自object,是否有原因/设计决策?对象的type/类本身是否也是对象?
  • 一个类(type)如何成为自身的示例?
  • 哪个是真实的的基类objecttype

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

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

我试着在Python标准库的文档中查找objecttype条目。
每个类(对象除外)都从对象继承。

>>> 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
u5i3ibmn

u5i3ibmn1#

你所有问题的答案都可以在这本书中找到:Python Types and Objects(也可以在以下文件中找到:Wayback machine archive
UPD:another link to the book。如果它也死了,告诉我。
回答你的问题最重要的部分:

  • 对象的类型/类是否也是对象本身?

是,根据第1章规则1:
“一切都是对象......我们定义的任何类都是对象,当然,这些类的示例也是对象。”

  • 哪个是真实的的基类objecttype

摘自第2章:
“这两个对象是Python中的基本对象。我们可能一次只引入一个,但这会导致鸡和蛋的问题--先引入哪个?这两个对象是相互依赖的--它们不能独立存在,因为它们是根据彼此定义的。”
卢西亚诺·拉马略在他的书《流畅的Python》中也说,这种关系不能用Python来表达(第21章):
“类对象和类型具有唯一的关系:object是type的一个示例,type是object的一个子类。这种关系很“神奇”:它不能用Python来表达,因为在定义另一个类之前,任何一个类都必须存在。type是自身的示例这一事实也很神奇。”
所以,对于你的问题:

  • 一个类(类型)如何成为它自己的示例?

Luciano说它也不能用Python来表达。

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

非常感谢作者谁使这说明在сhapter 3:

pod7payv

pod7payv2#

根据Python Data Model,Python中的一切都是对象,每个对象都有标识、类型和值。
object是所有对象的基类,type也是一个对象,所以它是object的一个示例,对于object本身也是如此。同样type是所有对象类型的基类,所以object的类型是type,对于type本身也是如此。
这是我的理解,有错误欢迎指出。

nbysray5

nbysray53#

<class 'type'>是类object的元类,每个类(包括type)都直接或间接继承了object
如果您需要查找更多关于元类的信息,请访问https://realpython.com/python-metaclasses/

nhhxz33t

nhhxz33t4#

我意识到它与Java中的instanceKlass和_java_mirror非常相似

相关问题