Для переопределения конструктора в наследуемом классе в 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()
, особенно в сложных иерархиях наследования.