0

在我的框架中,我必須確保,當一個類從ClassA繼承時,它必須從ClassB繼承,ClassB繼ClassA(爲了使重寫的方法工作[在Django表單])。例如。Python:檢查多重繼承中的類的順序

class MyClass(ClassA, ClassB) --> correct 

class MyClass(ClassA) --> wrong 

class MyClass(ClassB, ClassA) --> wrong 

是否有辦法讓ClassA檢查它是否跟着ClassB(在啓動時或運行時)?

回答

3

,而不是要求一個特定的繼承順序的,提供使用正確的順序代替一個ClassC

class ClassC(ClassA, ClassB): 

可以驗證基類與元類,但是這是矯枉過正,當一個簡單的基上課會做。 ClassA的元類別也將被調用ClassA的子類,那麼您只需測試bases參數以獲得正確的排序。

1

定義類後有辦法做到這一點。它使用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