2012-05-08 17 views
5

根据文档,object是所有新风格类的基类。Python的新风格类的基础 - 对象和类型

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

我想object继承type或使用type__metaclass__,但object.__bases__给我什么,所以从哪儿来这剂object,什么是bewteen并type关系?

回答

5

的确,类型(即,的object元类),一类是type

type(object) == type  # True 

而且由于object是基类,它有没有父母自身,正如你所期望:

object.__bases__ ==() # True 

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

现在是有点混乱,因为type事实上是object一个子类,其中博格尔斯头脑(如何typeobject得出,当你需要type构建object?),但这是由一个小硬解在Python解释器中的C级别编码。

这一切都只适用于新式的类,即从object派生。在Python 3中,所有类都是全新的,所以这适用于Python 3的全局。

+1

使用默认的元类?你的意思是,如果我定义了一个类(不是继承'object')而没有指定它的元类,那么这个类将被'type'构造? – Alcott

+1

嗯,是的,我认为是的。 – Alcott

+1

是的。如果不指定元类,'type'是Python使用的元类。 – kindall

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问题:

What is a metaclass in Python?

HTH!

+0

嗯,我倒认为'type'是'object'的元类,但'目录(对象)'甚至没有属性为'__metaclass__' ,为什么? – Alcott

+1

因为'type'是默认使用的。 '__metaclass__'可以用来覆盖它。 – yak

+0

感谢您的详细代码示例。 – Alcott

2

您可能会发现thisthis的帖子很有意思。下面是从第一个图:

enter image description here

+0

那么'object'是'type'的基础吗? – Alcott

+0

@Alcott:是的。 'type'是'object'的类型。阅读博客中的链接文章和其他相关文章以获得更深入的解释 –