旧式类,新式类和元类

时间:2012-05-08 08:02:31

标签: python class metaclass new-style-class

在Python 2.x中,所有新式类都隐式或显式地从object继承。然后看看:

>>> class M(type):
...     pass
...
>>> class A:
...     __metaclass__ = M
...
>>> class B:
...     pass
...
>>> a = A()
>>> b = B()
>>> type(A)
<class '__main__.M'>
>>> type(a)
<class '__main__.A'>

这是否意味着A是一个新式的课程?但A无论如何都不会继承object,对吧?

>>> type(B)
<class 'classobj'>
>>> type(b)
<type 'instance'>

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

>>> isinstance(A, object)
True
>>> isinstance(B, object)
True

为什么A的{​​{1}}和B个实例的实例?

如果object是[{1}}的实例,则B不会是object,对吗?

2 个答案:

答案 0 :(得分:5)

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

class M(type):
    pass

你使用:

class C:
    __metaclass__ = M

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

答案 1 :(得分:1)

关于你可以在这里阅读的插槽http://docs.python.org/release/2.5.2/ref/slots.html,片段:

  

默认情况下,旧式和新式类的实例都有一个属性存储字典。

对于新式类,您可以添加__slots__,然后不会创建每个对象的字典。