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