【问题标题】:Python: check the order of classes in multiple inheritancePython:检查多重继承中类的顺序
【发布时间】:2013-05-02 09:48:18
【问题描述】:
在我的框架中,我必须确保当一个类从 ClassA 继承时,它也必须从 ClassB 继承,ClassB 跟在 ClassA 之后(为了使被覆盖的方法[在 Django 形式中] 起作用)。例如
class MyClass(ClassA, ClassB) --> correct
class MyClass(ClassA) --> wrong
class MyClass(ClassB, ClassA) --> wrong
有没有办法让 ClassA 检查它是否跟在 ClassB 后面(在启动时或运行时)?
【问题讨论】:
标签:
python
django
inheritance
multiple-inheritance
method-resolution-order
【解决方案1】:
提供一个使用正确顺序的ClassC,而不是要求特定的继承顺序:
class ClassC(ClassA, ClassB):
您可以使用元类验证基类,但如果使用简单的基类就可以做到这一点。 ClassA 上的元类也会被 ClassA 的子类调用,然后您只需测试 bases 参数以获得正确的顺序。
【解决方案2】:
在定义类之后有一种方法可以做到这一点。它使用mro() 方法。
如果你有这样的事情
class A(object):
pass
class B(object):
pass
class C(A,B):
pass
如果您打印mro 的输出,您会得到以下结果。
print(A.mro(), B.mro(), C.mro())
([<class '__main__.A'>, <type 'object'>],
[<class '__main__.B'>, <type 'object'>],
[<class '__main__.C'>, <class '__main__.A'>, <class '__main__.B'>, <type 'object'>])
一种方法可能是:
if C.mro()[1] == A.mro()[0] and C.mro()[2] == B.mro()[0]:
go ahead
else:
raise Exception