5

根据文档,object是所有新式类的基类。

而且AFAIK,所谓的新式类只是可以通过继承获得一些新功能的类object,对吗?

我认为object继承type或使用type作为它的__metaclass__,但object.__bases__什么也没给我,那么这object是从哪里来的,它和它之间的关系是什么type

4

3 回答 3

5

事实上,一个类的类型(即元类)objecttype

type(object) == type      # True

由于object是基类,它没有自己的父类,正如您所期望的:

object.__bases__ == ()    # True

object没有__metaclass__属性,因为它不需要:它使用默认元类type.

现在它有点令人困惑,因为type它实际上是 的子类object,这令人难以置信(当你需要构造type如何派生?)但这可以通过 Python 解释器中的 C 级别的一些硬编码来解决。objecttype object

所有这些仅适用于新式类,即那些从object. 在 Python 3 中,所有类都是新样式的,因此这在 Python 3 中全局适用。

于 2012-05-08T06:40:53.420 回答
3

有两个概念可能有助于记住:

  • python中的一切都是一个对象,包括类和元类
  • 元类是类的构造函数,而不是它们的祖先,所以它们不会出现在__bases__.

这意味着object确实具有type元类。

就像好奇一样,故事的“自相矛盾”部分type是关于它)。

这个悖论是用python源代码中的一些C voodoo解决的,但我对此了解不多!

编辑:(一些示例代码)

>>> class MyMeta(type):
...     def __new__(cls, name, bases, dct):
...         return type.__new__(cls, name, bases, dct)
... 
>>> class MyClass(object):
...     __metaclass__ = MyMeta
... 

现在观察obj继承自object

>>> obj = MyClass()
>>> MyClass.__bases__
(<type 'object'>,)

至于您在评论中关于dir(obj)不输出__metaclass__属性的问题:原因是这__metaclass__的属性,而不是其实例化对象的属性。实际上请注意:

>>> dir(MyClass)
['__class__', '__delattr__', '__dict__', '__doc__', '__format__', '__getattribute__', '__hash__', '__init__', '__metaclass__', '__module__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__setattr__', '__sizeof__', '__str__', '__subclasshook__', '__weakref__']
>>> MyClass.__metaclass__
<class '__main__.MyMeta'>

如果您有兴趣加深对元类的理解,这是一个经典的 SO 问题(当然答案非常全面!):

Python 中的元类是什么?

于 2012-05-08T06:38:20.023 回答
2

你可能会发现这个这个帖子很有趣。这是第一个的图表:

在此处输入图像描述

于 2012-05-08T07:58:38.700 回答