旧式类,新式类和元类

Alc*_*ott 5 python metaclass class new-style-class

在Python 2.x中,所有新样式类都是object隐式或显式继承的.然后看看这个:

>>> class M(type):
...     pass
...
>>> class A:
...     __metaclass__ = M
...
>>> class B:
...     pass
...
>>> a = A()
>>> b = B()
Run Code Online (Sandbox Code Playgroud)
>>> type(A)
<class '__main__.M'>
>>> type(a)
<class '__main__.A'>
Run Code Online (Sandbox Code Playgroud)

这是否意味着A是一种新式的课程?但是不管怎样A都没有继承object,对吧?

>>> type(B)
<class 'classobj'>
>>> type(b)
<type 'instance'>
Run Code Online (Sandbox Code Playgroud)

好的,B是经典课,不是吗?

>>> isinstance(A, object)
True
>>> isinstance(B, object)
True
Run Code Online (Sandbox Code Playgroud)

为什么两者的实例AB实例object

如果B是一个实例object,那么type(B)不会classobj,对吧?

uhz*_*uhz 5

关于您可以在这里阅读的元类:http://docs.python.org/reference/datamodel.html#customizing-class-creation.通常,元类用于处理新样式类.当你写:

class M(type):
    pass
Run Code Online (Sandbox Code Playgroud)

你使用:

class C:
    __metaclass__ = M
Run Code Online (Sandbox Code Playgroud)

您将创建一个新的样式对象,因为M的定义方式(默认实现用于type创建新样式的类).您总是可以实现自己的元类,它将使用创建旧式类types.ClassType.