Как вызвать метод базового класса из класса-наследника?

Для вызова метода базового класса из класса-наследника, используют функцию super(). Пример:
  class Base:
      def method(self):
          print("Base method")

  class Derived(Base):
      def method(self):
          super().method()  # Вызов метода method из Base
          print("Derived method")

  obj = Derived()
  obj.method()
  
В данном примере, super().method() вызывает метод method из класса Base.

Вызвать метод базового класса из класса-наследника можно с помощью функции super() или указав имя базового класса напрямую. super() обычно предпочтительнее, так как она работает более надежно, особенно в случае множественного наследования.

Использование super():


class BaseClass:
    def method(self):
        print("Method from BaseClass")

class DerivedClass(BaseClass):
    def method(self):
        super().method()  # Вызов метода method из BaseClass
        print("Method from DerivedClass")

obj = DerivedClass()
obj.method()
  

В этом примере, super().method() в DerivedClass вызывает метод method из BaseClass. super() возвращает временный объект класса-родителя, позволяя вам вызывать его методы. Python автоматически передает self в метод базового класса.

Использование имени базового класса напрямую:


class BaseClass:
    def method(self):
        print("Method from BaseClass")

class DerivedClass(BaseClass):
    def method(self):
        BaseClass.method(self)  # Вызов метода method из BaseClass
        print("Method from DerivedClass")

obj = DerivedClass()
obj.method()
  

Здесь мы явно вызываем метод method базового класса, указывая BaseClass.method(self). Важно передать self явно, так как это обычный метод класса. Хотя этот способ работает, он менее гибкий и может привести к проблемам при изменении иерархии классов, особенно при множественном наследовании. Использование super() делает код более переносимым и удобным в сопровождении.

super() с аргументами:

В сложных случаях, особенно с множественным наследованием, можно использовать super(DerivedClass, self).method(). Это явно указывает, что нужно искать метод method, начиная с базового класса DerivedClass в иерархии классов. Однако, обычно super().method() достаточно и более читаемо.


class A:
    def __init__(self):
        print("A.__init__()")

class B(A):
    def __init__(self):
        super().__init__()
        print("B.__init__()")

obj = B()
  

Почему super() предпочтительнее:

  • Более гибкий и устойчивый к изменениям в иерархии классов.
  • Автоматически обрабатывает множественное наследование (используя MRO - Method Resolution Order).
  • Более читаемый и простой в использовании.
0