HTML Diff
0 added 0 removed
Original 2026-01-01
Modified 2026-03-10
1 <p>Теги: python, линеаризация, c3 linearization, mro, method resolution order, множественное наследование, поиск вызванного метода в иерархии классов, dylan, perl 6, слияние линеаризацией родителей класса, поиск в глубину</p>
1 <p>Теги: python, линеаризация, c3 linearization, mro, method resolution order, множественное наследование, поиск вызванного метода в иерархии классов, dylan, perl 6, слияние линеаризацией родителей класса, поиск в глубину</p>
2 <p>Допустим, есть следующая иерархия классов:</p>
2 <p>Допустим, есть следующая иерархия классов:</p>
3 class X(object): pass class Y(object): pass class A(X, Y): pass class B(Y, X): pass<p>И в ней, вообще говоря, ничего криминального нет. Но если вы захотите отнаследоваться от A и B, то вас ждёт разочарование. Выражение: class C(A, B): pass выдаст весьма интересную ошибку.</p>
3 class X(object): pass class Y(object): pass class A(X, Y): pass class B(Y, X): pass<p>И в ней, вообще говоря, ничего криминального нет. Но если вы захотите отнаследоваться от A и B, то вас ждёт разочарование. Выражение: class C(A, B): pass выдаст весьма интересную ошибку.</p>
4 <h2>В чем же дело?</h2>
4 <h2>В чем же дело?</h2>
5 <p>Всему причиный алгоритм<strong>MRO (method resolution order)</strong>, который используется в Python с версии 2.3. Он актуален только для new-style классов (наследуются от<strong>object</strong>), для classic-классов никаких ошибок не будет в данном случае.</p>
5 <p>Всему причиный алгоритм<strong>MRO (method resolution order)</strong>, который используется в Python с версии 2.3. Он актуален только для new-style классов (наследуются от<strong>object</strong>), для classic-классов никаких ошибок не будет в данном случае.</p>
6 <p>Под MRO некого класса "C" понимается его<strong>линеаризация</strong>- список предков класса, включая сам класс, отсортированный в порядке "удалённости". Так, линеаризацией класса "B" из примера выше будет<strong>[B, Y, X, object]</strong>. Таким образом MRO определяет, как в случае множественного наследования будет осуществляться поиск вызванного метода в данной иерархии классов.</p>
6 <p>Под MRO некого класса "C" понимается его<strong>линеаризация</strong>- список предков класса, включая сам класс, отсортированный в порядке "удалённости". Так, линеаризацией класса "B" из примера выше будет<strong>[B, Y, X, object]</strong>. Таким образом MRO определяет, как в случае множественного наследования будет осуществляться поиск вызванного метода в данной иерархии классов.</p>
7 <p>Для конструирования линеаризации класса в Python используется<strong>C3 linearization алгоритм</strong>. В своё время этот алгоритм разрабатывался для языка Dylan, но с тех пор был принят в Python и ещё, например, в Perl 6. Линеаризацией данного класса называется слияние линеаризацией его родителей.</p>
7 <p>Для конструирования линеаризации класса в Python используется<strong>C3 linearization алгоритм</strong>. В своё время этот алгоритм разрабатывался для языка Dylan, но с тех пор был принят в Python и ещё, например, в Perl 6. Линеаризацией данного класса называется слияние линеаризацией его родителей.</p>
8 <p>Финальный список формируется так: сначала добавляется данный класс, потом рассматривается первый класс из линеаризации первого родителя, если он не встречается в других списках, то добавляется в финальный и так далее. Если участвует, то переходим к рассмотрению следующего родителя.</p>
8 <p>Финальный список формируется так: сначала добавляется данный класс, потом рассматривается первый класс из линеаризации первого родителя, если он не встречается в других списках, то добавляется в финальный и так далее. Если участвует, то переходим к рассмотрению следующего родителя.</p>
9 <p>Как мы видели, не все классы поддаются линеаризации данным алгоритмом. Кстати, для classic-классов MRO реализуется через поиск в глубину, слева-направо.</p>
9 <p>Как мы видели, не все классы поддаются линеаризации данным алгоритмом. Кстати, для classic-классов MRO реализуется через поиск в глубину, слева-направо.</p>
10 <p><em>Есть что добавить или остались вопросы? Напишите в комментариях!</em></p>
10 <p><em>Есть что добавить или остались вопросы? Напишите в комментариях!</em></p>
11  
11