我对Python 3中的object
和type
类有点困惑,也许有人可以澄清我的困惑,或者提供一些额外的信息。
我目前的理解是,每个类(除了object
)都继承自一个名为object
的基类,但每个类(包括object
)也是type
类的示例,type
类是其自身和object
的示例,也继承自object
。
我的问题是:
object
是type
的示例,而type
继承自object
,是否有原因/设计决策?对象的type
/类本身是否也是对象?- 一个类(
type
)如何成为自身的示例? - 哪个是真实的的基类
object
或type
?
我一直认为object
将是最“基础”的类,但它似乎是type
的示例,type
是object
的示例,object
是type
的示例,......这种递归在哪里结束?
- 是否可以说明
object
和type
类之间的关系?
我试着在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'>,)
每个类都是类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
4条答案
按热度按时间u5i3ibmn1#
你所有问题的答案都可以在这本书中找到:Python Types and Objects(也可以在以下文件中找到:Wayback machine archive)
UPD:another link to the book。如果它也死了,告诉我。
回答你的问题最重要的部分:
是,根据第1章规则1:
“一切都是对象......我们定义的任何类都是对象,当然,这些类的示例也是对象。”
object
或type
?摘自第2章:
“这两个对象是Python中的基本对象。我们可能一次只引入一个,但这会导致鸡和蛋的问题--先引入哪个?这两个对象是相互依赖的--它们不能独立存在,因为它们是根据彼此定义的。”
卢西亚诺·拉马略在他的书《流畅的Python》中也说,这种关系不能用Python来表达(第21章):
“类对象和类型具有唯一的关系:object是type的一个示例,type是object的一个子类。这种关系很“神奇”:它不能用Python来表达,因为在定义另一个类之前,任何一个类都必须存在。type是自身的示例这一事实也很神奇。”
所以,对于你的问题:
Luciano说它也不能用Python来表达。
非常感谢作者谁使这说明在сhapter 3:
pod7payv2#
根据Python Data Model,Python中的一切都是对象,每个对象都有标识、类型和值。
object
是所有对象的基类,type
也是一个对象,所以它是object
的一个示例,对于object
本身也是如此。同样type
是所有对象类型的基类,所以object
的类型是type
,对于type
本身也是如此。这是我的理解,有错误欢迎指出。
nbysray53#
<class 'type'>
是类object
的元类,每个类(包括type
)都直接或间接继承了object
。如果您需要查找更多关于元类的信息,请访问https://realpython.com/python-metaclasses/
nhhxz33t4#
我意识到它与Java中的instanceKlass和_java_mirror非常相似