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