根据文档,object
是所有新式类的基类。
而且AFAIK,所谓的新式类只是可以通过继承获得一些新功能的类object
,对吗?
我认为object
继承type
或使用type
作为它的__metaclass__
,但object.__bases__
什么也没给我,那么这object
是从哪里来的,它和它之间的关系是什么type
?
事实上,一个类的类型(即元类)object
是type
:
type(object) == type # True
由于object
是基类,它没有自己的父类,正如您所期望的:
object.__bases__ == () # True
object
没有__metaclass__
属性,因为它不需要:它使用默认元类type
.
现在它有点令人困惑,因为type
它实际上是 的子类object
,这令人难以置信(当你需要构造时type
如何派生?)但这可以通过 Python 解释器中的 C 级别的一些硬编码来解决。object
type
object
所有这些仅适用于新式类,即那些从object
. 在 Python 3 中,所有类都是新样式的,因此这在 Python 3 中全局适用。
有两个概念可能有助于记住:
__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 问题(当然答案非常全面!):
!