编辑: 我认为这不是What are metaclasses in Python?的真实副本,即使在长评论的结尾部分回答了我的问题。
链接的问题通常针对元类。我的问题是关于特定的元类type
。据我所知,在阅读答案之后,type
元类无法在纯Python中实现。因此,我的问题不仅涉及“什么是元类?”,而且还涉及type
/ object
关系以及元类如何创建自身,这是通过在实现级别上“作弊”来实现的。
对于不熟悉元类概念的人来说,这两个问题似乎完全无关。
初始帖子:
我对Python 3中的object
和type
类感到有些困惑。也许有人可以消除我的困惑或提供一些其他信息。
每个类(object
除外)都从称为object
的基类继承。但是每个类(包括object
)也是类type
的实例,它是自身和object
的实例,并且还继承自object
。
是否有原因/设计决策,为什么object
是type
的实例,而type
继承自object
?对象的type
/类也可以是对象本身吗?
一个类(type
)如何成为其自身的实例?
哪个是真正的基类object
或type
?
我一直以为object
是最“基础”的类,但它似乎是type
的实例,而object
的实例是{{1 }},...
递归在哪里结束?
是否有可能说明type
和object
类之间的关系?
我在Python标准库的文档中查找了type
和object
的条目。
每个类(对象除外)都从对象继承。
type
每个类都是classes = [object, int, float, str, list, dict]
>>> for x in classes:
... 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 classes:
... 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
答案 0 :(得分:5)
您可以在本书中找到所有问题的答案:Python Types and Objects
回答问题的最重要部分:
是的,根据第1章的规则1
“一切都是对象。我们定义的任何类都是对象,当然,这些类的实例也是对象。”
propsData: {
member: {
type: Object,
default: null
}
},
data: () => ({ vm: {}}),
watch: {
member: {
handler(m) {
if (!m) { this.vm = {}; } else {
this.vm = {
memberName: m.name,
subscriptions: m.subscriptions.map(s => ({ ...s }))
};
}
},
immediate: true
}
}
或object
?第2章:
“这两个对象是Python中的原始对象。我们可能一次也引入了它们,但这会导致鸡肉和鸡蛋问题-首先要引入?这两个对象是相互依赖的-它们不能站立彼此定义,因为它们是彼此定义的。”
卢西亚诺·拉玛略(Luciano Ramalho)在他的《流利的Python》一书中也指出,这种关系无法用Python来表达(第21章):
“ class对象和类型具有唯一的关系:object是一个 类型的实例,类型是对象的子类。这种关系 是“魔术”:无法用Python表达,因为任何一个类都会 必须先存在,然后才能定义另一个。类型是事实 本身的实例也是神奇的。”
所以,对于您的问题:
Luciano说它也不能用Python表达。
非常感谢在第3章中做出此插图的作者。
答案 1 :(得分:1)
根据Python Data Model,Python中的所有内容都是一个对象,每个对象都有一个标识,一个类型和一个值。
object
是所有对象的基类,type
也是一个对象,因此它是object
的实例,与object
本身相同。此外,type
是所有对象类型的基类,因此object
的类型为type
,与type
本身相同。
这是我的理解,欢迎指出任何错误。
答案 2 :(得分:0)
<class 'type'>
是类object
的元类,每个类(包括type
)都直接或间接继承自object
。
如果您需要更多有关元类的信息,请在这里https://realpython.com/python-metaclasses/