2012-05-08 26 views
5

在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的实例和objectB实例?

如果Bobject的实例,那么type(B)不会是classobj,对不对?

+4

什么都是对象! – orlp

+0

你不应该在这个问题中使用'__slots__'。这完全是另一个问题。 –

+0

@ChrisMorgan,是的,我刚刚意识到这一点。 – Alcott

回答

5

关于您可能在这里阅读的元类:http://docs.python.org/reference/datamodel.html#customizing-class-creation。一般来说,元类是用来处理新的风格类的。当你写:

class M(type): 
    pass 

,并使用:

class C: 
    __metaclass__ = M 

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