在Python2.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为什么object的A实例和B实例都是
如果B是object的一个实例,那么type(B)就不是classobj,对吧?
发布于 2012-05-08 16:43:57
关于元类,你可以在这里阅读:http://docs.python.org/reference/datamodel.html#customizing-class-creation。一般来说,元类是用来处理新的样式类的。当你写的时候:
class M(type):
pass您可以使用:
class C:
__metaclass__ = M您将创建一个新的样式对象,因为M的定义方式(默认实现使用type创建一个新样式的类)。您可以始终实现自己的元类,它将使用types.ClassType创建旧式类。
发布于 2012-05-08 16:46:12
关于插槽,您可以在这里阅读http://docs.python.org/release/2.5.2/ref/slots.html,这是一个片段:
默认情况下,旧样式类和新样式类的实例都有一个字典用于属性存储。
对于新样式的类,您可以添加__slots__,然后将不会创建每个对象的字典。
https://stackoverflow.com/questions/10494853
复制相似问题