super().__init__() - Инициализация из родительского класса
Используется, в паттерне DRY, например.
class Person:
def __init__(self, name)
self.name = name
class Student(Person):
def __init__(self, name, surname):
super().__init__(name)
self.surname = surname
s = Student("Ivan", "Ivanoff")
print(s.__dict__)
# {"name": "Ivan", "surname": "Ivanoff"}
12345678910111213
[!info]
super().__init__()
- расположение имеет значение Если он будет снизу всех переменных, то вызов__init__()
родительского класса может переписать переменные с одинаковым именем.
class GreetingFormal:
def __init__(self):
self.formal_greeting = "Добрый день,"
def greet_formal(self, name):
return f"{self.formal_greeting} {name}!"
class GreetingInformal:
def __init__(self):
self.informal_greeting = "Привет,"
def greet_informal(self, name):
return f"{self.informal_greeting} {name}!"
class GreetingMix(GreetingFormal, GreetingInformal):
def __init__(self):
GreetingFormal.__init__(self)
GreetingInformal.__init__(self)
mixed_greeting = GreetingMix()
print(mixed_greeting.greet_formal("Пользователь"))
print(mixed_greeting.greet_informal("Пользователь"))
12345678910111213141516171819202122232425262728
В методе __init__
класса GreetingMix
не используется super()
- используется непосредственный вызов из базовых классов с указанием имён этих классов.
Из-за того, что метод __init__
присутствует в обоих базовых классах и происходит конфликт.
Интерпретатор при использовании функции super()
в нашем примере использовал бы метод того класса, который стоит левее при перечислении в объявлении производного класса.
Last updated
Was this helpful?