Для переопределения конструктора в наследуемом классе в Python нужно создать метод __init__() в этом классе.
Обычно, чтобы не потерять логику базового класса, в переопределенном __init__() вызывается конструктор родительского класса через super().__init__(...), передавая необходимые аргументы.
Пример:
class Parent:
def __init__(self, name):
self.name = name
class Child(Parent):
def __init__(self, name, age):
super().__init__(name)
self.age = age
При переопределении конструктора (метода __init__) в наследуемом классе, важно помнить о двух ключевых аспектах:
super(). Если этого не сделать, атрибуты родительского класса могут быть не инициализированы, что приведет к ошибкам.Вот пример:
class Parent:
def __init__(self, name):
self.name = name
print("Parent __init__ called")
def get_name(self):
return self.name
class Child(Parent):
def __init__(self, name, age):
super().__init__(name) # Вызов конструктора родительского класса
self.age = age
print("Child __init__ called")
def get_age(self):
return self.age
# Создание экземпляра дочернего класса
child = Child("Alice", 10)
print(f"Имя: {child.get_name()}") # Вызов метода родительского класса
print(f"Возраст: {child.get_age()}") # Вызов метода дочернего класса
Объяснение кода:
Parent - родительский класс с атрибутом name.Child - наследуемый класс.Child, super().__init__(name) вызывает конструктор Parent, передавая значение name для инициализации атрибута name в родительском классе.Child инициализирует атрибут age, специфичный для дочернего класса.Важность super():
super() обеспечивает правильную инициализацию родительского класса и корректную работу наследования. Особенно это важно при множественном наследовании и использовании MRO (Method Resolution Order).
Альтернативный способ (устаревший):
Хотя он и работает, использование Parent.__init__(self, name) (явно вызывая конструктор родительского класса) считается менее предпочтительным, чем использование super(), особенно в сложных иерархиях наследования.