根据文档,object
是所有新风格类的基类。Python的新风格类的基础 - 对象和类型
而AFAIK,所谓的新式课程只是通过继承object
来获得一些新的吸引力,对吗?
我想object
继承type
或使用type
为__metaclass__
,但object.__bases__
给我什么,所以从哪儿来这剂object
,什么是bewteen并type
关系?
根据文档,object
是所有新风格类的基类。Python的新风格类的基础 - 对象和类型
而AFAIK,所谓的新式课程只是通过继承object
来获得一些新的吸引力,对吗?
我想object
继承type
或使用type
为__metaclass__
,但object.__bases__
给我什么,所以从哪儿来这剂object
,什么是bewteen并type
关系?
的确,类型(即,的object
元类),一类是type
:
type(object) == type # True
而且由于object
是基类,它有没有父母自身,正如你所期望:
object.__bases__ ==() # True
object
没有按没有__metaclass__
属性,因为它不需要它:它使用默认元类type
。
现在是有点混乱,因为type
事实上是object
一个子类,其中博格尔斯头脑(如何type
从object
得出,当你需要type
到构建object
?),但这是由一个小硬解在Python解释器中的C级别编码。
这一切都只适用于新式的类,即从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问题:
What is a metaclass in Python?
HTH!
使用默认的元类?你的意思是,如果我定义了一个类(不是继承'object')而没有指定它的元类,那么这个类将被'type'构造? – Alcott
嗯,是的,我认为是的。 – Alcott
是的。如果不指定元类,'type'是Python使用的元类。 – kindall