Python的新式类的基础 - “对象”和“类型”

时间:2012-05-08 06:28:04

标签: python object types

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

而AFAIK,所谓的新式课程只是通过继承object获得一些新的东西,对吗?

我认为object继承type或使用type作为其__metaclass__,但object.__bases__却没有给我任何内容,所以在object来自,和它之间有什么关系type

3 个答案:

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

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

  • 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__类的属性< / 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)

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

enter image description here