Функция Python super()
super()Это встроенная функция в Python, используемая для вызова методов родительского класса (суперкласса).
При наследовании классов,super()она позволяет вызывать методы родительского класса, обеспечивая повторное использование кода и расширение методов. Это очень важная функция в объектно-ориентированном программировании на Python.
Определение слова: superОно означает "super", здесь имеется в виду родительский класс или суперкласс.
Базовый синтаксис и параметры
Формат синтаксиса
super() super(type, object-or-type)
Описание параметра
- Тип параметра:
- Тип: класс
- Описание: класс, для которого нужно получить прокси родительского класса.
- Параметр object-or-type:
- Тип: object или class
- Описание: Должен быть экземпляром или подклассом типа.
Описание функций
- Возвращаемое значение: Возвращает прокси-объект, используемый для вызова методов родительского класса.
- Особенность: Поддерживает порядок разрешения методов (MRO) и корректно обрабатывает множественное наследование.
Примеры
Пример 1: Вызов конструктора родительского класса в подклассе
Пример
# Родительский класс
class Animal:
def __init__(self, name):
self.name = name
print(f"Животное {self.name} родилось")
def speak(self):
print("Животное издаёт звук")
# Подкласс
class Dog(Animal):
def __init__(self, name, breed):
# Вызов __init__ родительского класса
super().__init__(name)
self.breed = breed
print(f"Порода: {self.breed}")
def speak(self):
# Вызов метода родительского класса
super().speak()
print("Гав!")
#
dog = Dog("Little White", "Husky")
# Вывод:
# Животное Little White родилось
# Порода — Husky
dog.speak()
# Вывод:
# Животное издаёт звук
# Гав!
class Animal:
def __init__(self, name):
self.name = name
print(f"Животное {self.name} родилось")
def speak(self):
print("Животное издаёт звук")
# Подкласс
class Dog(Animal):
def __init__(self, name, breed):
# Вызов __init__ родительского класса
super().__init__(name)
self.breed = breed
print(f"Порода: {self.breed}")
def speak(self):
# Вызов метода родительского класса
super().speak()
print("Гав!")
#
dog = Dog("Little White", "Husky")
# Вывод:
# Животное Little White родилось
# Порода — Husky
dog.speak()
# Вывод:
# Животное издаёт звук
# Гав!
Ожидаемый вывод:
The animal Xiaobai was born Breed: Husky The animal makes sounds Woof woof!
Анализ кода:
super().__init__(name)Вызывает конструктор родительского класса.super().speak()Вызывает метод родительского класса.- Это позволяет расширить функциональность родительского класса в подклассе.
Пример 2: Множественное наследование
Пример
# Пример множественного наследования
класс A:
def method(self):
print("A.method")
класс B(A):
def method(self):
print("B.method")
super().method() # Вызов A.method
класс C(A):
def method(self):
print("C.method")
super().method() # Вызов A.method
класс D(B, C):
def method(self):
print("D.method")
super().method() # Вызов в порядке MRO
# MRO: D -> B -> C -> A
d = D()
d.method()
# Вывод:
# D.method
# B.method
# C.method
# A.method
# Просмотр MRO
print(D.__mro__)
класс A:
def method(self):
print("A.method")
класс B(A):
def method(self):
print("B.method")
super().method() # Вызов A.method
класс C(A):
def method(self):
print("C.method")
super().method() # Вызов A.method
класс D(B, C):
def method(self):
print("D.method")
super().method() # Вызов в порядке MRO
# MRO: D -> B -> C -> A
d = D()
d.method()
# Вывод:
# D.method
# B.method
# C.method
# A.method
# Просмотр MRO
print(D.__mro__)
Ожидаемый вывод:
D.method B.method C.method A.method (<class '__main__.D'>, <class '__main__.B'>, <class '__main__.C'>, <class '__main__.A'>, <class 'object'>)
Анализ кода:
super()Вызывается в соответствии с MRO (порядок разрешения методов).- Это обеспечивает корректность множественного наследования.
Пример 3: без параметров (рекомендуется)
Пример
# Рекомендуемое использование в Python 3: параметры не нужны
class Parent:
def greet(self, name):
return f"Привет, {name}!"
class Child(Parent):
def greet(self, name):
# Вызов метода родительского класса и расширение
message = super().greet(name)
return message + " С возвращением!"
child = Child()
print(child.greet("Том"))
# Вывод: Привет, Том! С возвращением!
class Parent:
def greet(self, name):
return f"Привет, {name}!"
class Child(Parent):
def greet(self, name):
# Вызов метода родительского класса и расширение
message = super().greet(name)
return message + " С возвращением!"
child = Child()
print(child.greet("Том"))
# Вывод: Привет, Том! С возвращением!
Ожидаемый вывод:
Запуск в реальной среде отобразит расширенное приветствие.
super()Это ключевая функция для реализации наследования классов и полиморфизма в Python.
Другие расширения