2015-09-12 49 views
2

我有下面的類層次結構:如何調用一個方法,同時覆蓋它

class AbstractClass(object): 
     __metaclass__ = ABCMeta 

     @abstractmethod 
     def foo(self): 
      pass 

    class A(AbstractClass): 
     def __init__(): 
      super().__init__() 

     def foo(self): 
      //Logic 

    class B(A): 
     def __init__(): 
      super().__init__() 

我想使用FOO,因爲它是在實現的,所以我不能覆蓋它B. 使用B.foo ()的作品,但我仍然得到PyCharm警告:

「B類必須實現所有抽象方法」

我一定要覆蓋一個方法已經OV錯誤的抽象方法?我如何重寫它而不會丟失實現?只需將該方法複製到子類中?

+0

我看到你使用Python 3? – bagrat

回答

0

我只是想問這個問題,當我突然想到它是如何工作的。我想過「在我剛剛覆蓋它之後我怎麼能調用一個方法?」 經過一番思考,我終於明白了。

呼叫從超類中重寫的方法,而在子類中重寫它:

class B(A): 
    def __init__(): 
     super().__init__() 

    def foo(self): 
     super().foo() 

這工作,因爲一個超類型的方法必須與它的亞型工作,無需提供進一步的落實。在我弄清楚之後,它似乎很合乎邏輯。

這可能對那些只知道繼承是如何工作的人有用。

+0

我不確定你的最終目標是什麼,但是,對於超級,你可以調用超類中定義的那個。如果名稱不存在於對象的名稱空間中,那麼當你通過'self'引用一個名稱時,Python會在超類的名稱空間中查找,所以如果你不需要重寫'foo',B中只需使用'self。 foo()'調用'A'中定義的那個。 – Pynchia