fel*_*nho 11 python oop metaprogramming object python-3.x
编辑: 我不认为这是Python中什么是元类的真实副本?,即使在长评论的结尾部分回答了我的问题。
链接的问题通常针对元类。我的问题是关于特定的元类的type
。而且据我所知,阅读答案后,type
无法在纯Python中实现元类。因此,我的问题不仅是关于“什么是元类?”,而且还涉及type
/ object
关系以及元类如何创建自身,这是通过在实现级别上“作弊”来实现的。
对于不熟悉元类概念的人来说,这两个问题似乎完全无关。
初始帖子:
我对Python 3中的object
和type
类有些困惑。也许有人可以消除我的困惑或提供一些其他信息。
每个类(除外object
)都从称为的基类继承object
。但是每个类(包括object
)也是该类的type
一个实例,它是自身的实例,object
并且也从继承object
。
是否有一个原因/设计决定,为什么object
是的实例type
并type
从中继承object
?type
对象的/ class 是否也可以是对象本身?
类(type
)如何成为其自身的实例?
哪一个是真正的基类object
或type
?
我一直认为object
这将是最“基础”的类,但它似乎是的实例type
,这是的实例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'>,)
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)
您可以在本书中找到所有问题的答案:Python类型和对象
回答您问题的最重要部分:
是的,根据第一章的规则1:
“一切都是对象。我们定义的任何类都是对象,当然,这些类的实例也是对象。”
object
或type
?从第2章开始:
“这两个对象是Python中的原始对象。我们可能一次也引入了它们,但这会导致鸡肉和鸡蛋问题-首先引入?这两个对象是相互依赖的-自从它们不能独立存在它们是彼此定义的。”
Luciano Ramalho在他的书“ Fluent Python”中也说过,这种关系不能用Python来表达(第21章):
“类的对象和类型具有独特的关系:对象是类型的实例,类型是对象的子类。这种关系是“魔术”的:它无法用Python表达,因为任何一个类都必须在另一个可以存在之前存在类型是其本身的实例这一事实也是不可思议的。”
因此,对于您的问题:
Luciano说它也不能用Python表达。
非常感谢在第3章中做了此插图的作者: