В Python существует несколько способов обращения к родительскому классу из дочернего класса. Рассмотрим основные подходы:
Самый современный и рекомендуемый способ - использование функции super(). Она возвращает прокси-объект, который делегирует вызовы методов родительского класса.
class Parent:
def __init__(self, name):
self.name = name
class Child(Parent):
def __init__(self, name, age):
super().__init__(name) # Вызов __init__ родительского класса
self.age = age
class A:
def method(self):
print("A method")
class B(A):
def method(self):
print("B method")
super().method() # Вызов метода из A
class C(A):
def method(self):
print("C method")
super().method()
class D(B, C):
def method(self):
super().method() # Вызовет B.method(), затем C.method(), затем A.method()
Можно напрямую обратиться к родительскому классу по имени (но это менее гибкий подход):
class Child(Parent):
def __init__(self, name, age):
Parent.__init__(self, name) # Явный вызов родительского метода
self.age = age
selfМожно получить родительские классы через __bases__ или __mro__:
class Child(Parent):
def get_parent_class(self):
return self.__class__.__bases__[0] # Получаем первый родительский класс
| Характеристика | super() | Прямое обращение |
|---|---|---|
| Множественное наследование | Правильно работает | Может вызвать проблемы |
| Поддержка изменений | Автоматически адаптируется | Требует ручного обновления |
| Читаемость | Более современный синтаксис | Более явный, но устаревший |
| Передача self | Не требуется | Требуется |
super() можно использовать без аргументов в методахПример с MRO:
class A:
def method(self):
print("A")
class B(A):
def method(self):
print("B")
super().method()
class C(A):
def method(self):
print("C")
super().method()
class D(B, C):
def method(self):
super().method()
d = D()
d.method() # Выведет: B → C → A (согласно MRO)
Для ссылки на родительский класс в Python:
super() - это современный, гибкий и безопасный способsuper() стал проще и удобнее, чем в Python 2Правильное использование super() делает ваш код: