在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
,对吗? 最佳答案
关于元类,您可以在这里阅读:http://docs.python.org/reference/datamodel.html#customizing-class-creation。通常,元类旨在与新样式类一起使用。当你写的时候:
class M(type):
pass
而您使用:
class C:
__metaclass__ = M
您将创建一个新样式对象,因为定义了M的方式(默认实现使用
type
创建新样式类)。您始终可以实现自己的元类,该元类将使用types.ClassType
创建旧式类。关于python - 旧样式类,新样式类和元类,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/10494853/