В 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()
делает ваш код: