对于多重继承的元类,我有点困惑。你知道吗
考虑以下代码:
class MetaClass1(type):
def __init__(cls, name, bases, dict_):
print "MetaClass1"
class MetaClass2(type):
def __init__(cls, name, bases, dict_):
print "MetaClass2"
class A(object):
__metaclass__ = MetaClass1
class B(object):
__metaclass__ = MetaClass2
class C(A, B):
pass
其输出如下:
“元类1”
“元类2”
关于元类冲突的TypeError,这是预期的,没有问题。
接下来我将稍微更改代码并执行以下操作:
class MetaClass1(type):
def __init__(cls, name, bases, dict_):
print "MetaClass1"
class MetaClass2(MetaClass1):
def __init__(cls, name, bases, dict_):
print "MetaClass2 inherits"
super(MetaClass2, cls).__init__(name, bases, dict_)
class A(object):
__metaclass__ = MetaClass1
class B(object):
__metaclass__ = MetaClass2
class C(A, B):
pass
这次的输出是:
“元类1”
“元类2继承”
“元类1”
“元类2继承”
“元类1”
C类MRO为:
[<class '__main__.C'>, <class '__main__.A'>, <class '__main__.B'>, <type 'object'>]
为什么类C接收元类2作为它的元类而不是元类1?你知道吗
当决定一个没有显式指定元类的类的元类时,比如在
C
的情况下,Python检查被创建的类的所有超类(直接和间接)的元类,并选择一个元类,它是被创建的类的超类的所有元类的子类型。如果没有这样的元类,它将引发TypeError
。你知道吗在您的示例中,
MetaClass2
是从C
的超类的所有元类继承的元类。你知道吗语言参考的section 3.3.3.1中介绍了这一点。你知道吗
相关问题 更多 >
编程相关推荐