Python: проверьте порядок классов при множественном наследовании

В моей структуре я должен гарантировать, что когда класс наследуется от ClassA, он также должен наследоваться от ClassB, при этом ClassB следует за ClassA (чтобы переопределенные методы работали [в формах Django]). Например.

class MyClass(ClassA, ClassB) --> correct

class MyClass(ClassA) --> wrong

class MyClass(ClassB, ClassA) --> wrong

есть ли способ заставить ClassA проверить, что за ним следует ClassB (при запуске или во время выполнения)?


person Don    schedule 02.05.2013    source источник


Ответы (2)


Вместо того, чтобы требовать определенного порядка наследования, укажите ClassC, который использует правильный порядок вместо этого:

class ClassC(ClassA, ClassB):

Вы можете проверить базовые классы с помощью метакласса, но это излишне, когда подойдет простой базовый класс. Метакласс ClassA будет вызываться и для подклассов ClassA, тогда вы просто проверяете параметр bases на правильность порядка.

person Martijn Pieters    schedule 02.05.2013

Есть способ сделать это после определения классов. Он использует метод 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
person Francesco Montesano    schedule 02.05.2013