根据文档,object
是所有新式类的基类。
而AFAIK,所谓的新式课程只是通过继承object
获得一些新的东西,对吗?
我认为object
继承type
或使用type
作为其__metaclass__
,但object.__bases__
却没有给我任何内容,所以在object
来自,和它之间有什么关系type
?
答案 0 :(得分:5)
事实上,object
类的类型(即元类)是type
:
type(object) == type # True
由于object
是基类,它没有自己的父母,正如你所期望的那样:
object.__bases__ == () # True
object
没有__metaclass__
属性,因为它不需要一个:它使用默认的元类type
。
现在它有点令人困惑,因为type
实际上是object
的子类,令人难以置信(如果需要,type
如何object
type
{1}}到构造 object
?)但这可以通过Python解释器中C级的一点硬编码来解决。
所有这些仅适用于新式类,即从object
派生的类。在Python 3中,所有类都是新式的,因此这在Python 3中全局适用。
答案 1 :(得分: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__
是类的属性< / em>不是其实例化的对象 。请注意:
>>> 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问题(当然,答案非常全面!):
What is a metaclass in Python?
HTH!
答案 2 :(得分:2)