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() предпочтительнее: