2017-03-28 27 views
1

假設我們有如下繼承鏈:如何從繼承鏈中的幾個級別的基類調用方法?

class Base: 
    def method(self): 
     # … 

class Derived1(Base): 
    def method(self): 
     # … 

class Derived2(Derived1): 
    pass 

class Derived3(Derived2): 
    def method(self): 
     # … 

的問題:我想在某種程度上Derived3定義method,使其從Base調用自身。

通常我會這樣寫:

class Derived3(Derived2): 
    super().method() 

但這會叫methodDerived1,這是我想避免什麼。我想從Base撥打method

回答

1

您可以顯式調用父類中的一員,只是傳遞self作爲第一個參數:

Base.method(self) 

完整的示例:

class Derived3(Derived2): 
    def method(self): 
     Base.method(self) 

這將通過self指定的實例執行Base.method,在訪問時自動傳遞給Derived3.methodthrough an instance

1

最簡單的方法是直接調用Base方法,傳遞self明確:

Base.method(self) 

如果目標是跳到「無論是在MRO一些已知的不良超級下課」不過,你可以使用super與明確的論據作爲好像它被稱爲從「壞超級」,所以它移動到「無論下一個」:

class Derived3(Derived2): 
    def method(self): 
     # Call method from next class after Derived1 in MRO, which happens to be Base 
     # Using super means the method is bound, so self passed implicitly to method 
     super(Derived1, self).method()