TGViewer
Библиотека питониста | Python, Django, Flask Библиотека питониста | Python, Django, Flask @pyproglib · 37.3K subscribers
Post #7336 3.24K
👓 Тайная жизнь Python: super() и Method Resolution Order (MRO)

Почему super() не всегда означает «родительский класс» и что оно делает на самом деле.

Вы пишете наследование в Python, кажется всё просто… но вывод программы может вас удивить:
class A:
def process(self):
print("A.process()")

class B(A):
def process(self):
print("B.process()")
super().process()

class C(A):
def process(self):
print("C.process()")
super().process()

class D(B, C):
def process(self):
print("D.process()")
super().process()

d = D()
d.process()


Ожидание:
D.process()
B.process()
A.process()


Реальность:
D.process()
B.process()
C.process()
A.process()


Почему C.process() вызывается, если B наследуется от A? Всё дело в Method Resolution Order (MRO).

➡️ MRO — порядок поиска методов

Каждый класс в Python имеет атрибут __mro__ — последовательность классов, через которую Python ищет методы:
class A: pass
class B(A): pass
class C(A): pass
class D(B, C): pass

print(D.__mro__)
# (<class '__main__.D'>, <class '__main__.B'>, <class '__main__.C'>,
# <class '__main__.A'>, <class 'object'>)


Вывод: super() вызывает следующий класс в MRO, а не «родительский класс».

➡️ Алгоритм C3 Linearization

Python использует C3 линейнизацию, чтобы определить MRO. Основные правила:
1️⃣ Дети перед родителями
2️⃣ Порядок слева направо из списка наследников
3️⃣ Сохранять порядок родительских MRO (монотонность)

Пример для class D(B, C):
L(D) = D + merge(L(B), L(C), [B, C])
L(B) = B, A, object
L(C) = C, A, object
merge([B,A,object],[C,A,object],[B,C]) -> D,B,C,A,object


Это гарантирует, что каждый класс вызывается ровно один раз, решая «алмазную проблему».

➡️ Практическая сила super() + MRO

Использование с cooperative mixins:
class LoggingMixin:
def __init__(self, **kwargs):
print("LoggingMixin.__init__")
super().__init__(**kwargs)

class ValidationMixin:
def __init__(self, **kwargs):
print("ValidationMixin.__init__")
super().__init__(**kwargs)

class Base:
def __init__(self, name):
self.name = name
print(f"Base.__init__: {name}")

class Document(LoggingMixin, ValidationMixin, Base):
def __init__(self, name, **kwargs):
print("Document.__init__")
super().__init__(name=name, **kwargs)

doc = Document("report.pdf")
# Output:
# Document.__init__
# LoggingMixin.__init__
# ValidationMixin.__init__
# Base.__init__: report.pdf


Правила для mixins:
1️⃣ Принимать **kwargs и передавать их дальше
2️⃣ Вызывать super().__init__() всегда
3️⃣ Извлекать только свои параметры

Так работает cooperative multiple inheritance: каждый класс выполняется один раз в правильном порядке.

Ошибки, которые часто встречаются:
1️⃣ Несогласованные сигнатуры методов → используйте **kwargs
2️⃣ Неполный вызов super()→ классы в цепочке могут быть пропущены
3️⃣ Ошибочные предположения про родителя → super() зависит от MRO, а не от «родительского класса»

Проверка MRO и super():
print(Document.__mro__)
# (<class 'Document'>, <class 'LoggingMixin'>,
# <class 'ValidationMixin'>, <class 'Base'>, <class 'object'>)


isinstance() и issubclass() также следуют MRO.

🔹 Курс «Программирование на языке Python»
🔹 Получить консультацию менеджера
🔹 Сайт Академии 🔹 Сайт Proglib

🐸 Библиотека питониста

#буст
  • ❤ 13
  • 👍 9
  • 🔥 2
More from @pyproglib
  1. Oct 3, 2026📚Напоминаем про наш полный курс «Самоучитель по Python для начинающих» Мы написали и собр…
  2. Oct 2, 2026🎹 Что делать после ChatGPT? Следующий шаг — AI-агенты. Они не просто отвечают на запросы,…
  3. Sep 30, 2026🔥 Последний день для разработчиков AI уже пишет код. Теперь важнее научиться встраивать е…
  4. Sep 25, 2026🔥 Курс «ИИ для разработчиков» уже стартовал И мы решили открыть первое занятие всем — мож…
  5. Sep 20, 2026👻 94% токенов уходят не на код Анализ запусков показал: основная часть токенов уходит на…
  6. Sep 19, 2026📚Напоминаем про наш полный курс «Самоучитель по Python для начинающих» Мы написали и собр…
Threads Profile ViewerView any public Threads profile without an account.Open ThreadLook →Writing with AI? Make it sound human.Metric37 rewrites AI drafts so they read naturally. Free AI detector, 1,500 words free.Try Metric37 →