在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
,对吗?
答案 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__
,然后不会创建每个对象的字典。