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

时间:2019-04-20 15:57:20

标签: python python-3.x oop object metaprogramming

编辑: 我认为这不是What are metaclasses in Python?的真实副本,即使在长评论的结尾部分回答了我的问题。

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

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


初始帖子:

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

我目前的理解:

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

我的问题:

  • 是否有原因/设计决策,为什么objecttype的实例,而type继承自object?对象的type /类也可以是对象本身吗?

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

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

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

我尝试过的事情:

我在Python标准库的文档中查找了typeobject的条目。

如何检查:

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

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

3 个答案:

答案 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章中做出此插图的作者。

relation between object, type and other classes

答案 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/