【发布时间】:2012-05-16 17:09:18
【问题描述】:
在 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 和B 的实例都是object 的实例?
如果B 是object 的一个实例,那么type(B) 就不会是classobj,对吧?
【问题讨论】:
-
您不应该将
__slots__放在这个问题中。这完全是另一个问题。 -
@ChrisMorgan,是的,我刚刚意识到这一点。
-
A 是一个新样式类,因为 '新样式类是使用 type()' 构造的,并且您已将它的元类设置为
type。旧式类使用types.ClassType -
@jamylak,如你所见,
A没有继承自object,但我仍然在A中使用__metaclass__,这样可以吗?因为我想,__metaclass__只能用于继承自object的类,对吧? -
__metaclass__用于每个类。每个类都有一个构建它的元类。
标签: python class metaclass new-style-class