2015-09-12 4 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

Я не уверен, какова ваша конечная цель, но да, с супер вы можете назвать тот, который определен в суперклассе. Python смотрит в пространство имен суперклассов, когда вы ссылаетесь на имя через 'self', если имя отсутствует в пространстве имен объекта, поэтому в случае, если вам не нужно переопределять' foo' конкретно, в B просто используйте 'self. foo() ', чтобы вызвать тот, который определен в' A'. – Pynchia

Смежные вопросы