【问题标题】:what is the difference between type class and object class in pythonpython中类型类和对象类有什么区别
【发布时间】:2021-06-04 13:08:53
【问题描述】:

我正在学习元类,我看到每个类都是 python 中类型类的子类,但有时我看到人们使用对象类但对象类也是类型类的子类,那么它们之间有什么区别?

【问题讨论】:

  • 这能回答你的问题吗? Class vs. Type in Python
  • objectPython 中所有内容的基类。这就是人们说“一切都是对象*”的意思。因此,如果您对任何 isinstance(x, object) 执行任何 x,它总是是正确的。没有必要明确继承 object,即默认情况下会发生,所以class Foo(object): ... 等价于class Foo: ...
  • @mkrieger1 不完全是......这是在讨论新旧样式类。在 Python 3 中,所有 类都是type 的实例。而所有实例(即一切)是object 的一个实例。情况并非总是如此。
  • 你可能会注意到,有一个循环:isinstance(object, type)isinstance(type, object) 都是真的!也许更奇怪的是,type(type) is type,就此而言,isinstance(object, object) 是真的!在此处阅读更多信息:stackoverflow.com/questions/55775218/…
  • “每个类都是类型类的子类” - 错误 - “但对象类也是类型类的子类” - 不,不是。

标签: python metaclass


【解决方案1】:

object 不是type 的子类:它是instance 类型。

object,类,是 Python 中所有类层次结构的根 - 然而,由于 Python 中的所有内容都是一个实例,它必须有一个“类”,当使用适当的参数正确实例化时会产生它。

因为这是一个明显的“鸡和蛋”悖论,毕竟类type本身必须继承自对象,类层次结构的那部分是循环手工连接的:不可能复制相同的纯 Python 代码中的关系。

最后:作为元类的实例的类与继承或作为该元类的子类不同:继承层次结构是一回事,用于构造每个类本身的元类是另一回事,正交的东西。

所以,回顾一下:Python 中的所有类本身都是“元类”的实例——默认的元类是type。 Python 中的所有类也继承自 object - 其中包括 typeobject 类本身也必须是 type 的一个实例,并且这种关系是硬编码在 Python 运行时源代码中(在 cPython 的情况下是用 C 编写的)

【讨论】:

  • 太棒了...我真的很想听到这句话:“在纯 Python 代码中复制相同的关系是不可能的。”
猜你喜欢
  • 1970-01-01
  • 2013-03-20
  • 2014-02-19
  • 1970-01-01
  • 2011-11-15
  • 2010-10-02
  • 2014-03-22
  • 2021-04-02
  • 1970-01-01
相关资源
最近更新 更多