HTML Diff
1 added 1 removed
Original 2026-01-01
Modified 2026-02-26
1 <p>В курсе "Python: Полиморфизм" мы разбирали, как работает полиморфизм изнутри. Но как наследование влияет на полиморфизм, осталось не до конца раскрытым.</p>
1 <p>В курсе "Python: Полиморфизм" мы разбирали, как работает полиморфизм изнутри. Но как наследование влияет на полиморфизм, осталось не до конца раскрытым.</p>
2 - <p>В этом уроке мы погрузимся в данную тему и обсудим, как наследоване взаимодействует с полиморфизмом и как это влияет на структуру и функциональность кода.</p>
2 + <p>В этом уроке мы погрузимся в данную тему и обсудим, как наследование взаимодействует с полиморфизмом и как это влияет на структуру и функциональность кода.</p>
3 <h2>Особенности полиморфизма и наследования</h2>
3 <h2>Особенности полиморфизма и наследования</h2>
4 <p>Для полиморфизма наследование не нужно. При этом наследование участвует в процессе выбора метода.</p>
4 <p>Для полиморфизма наследование не нужно. При этом наследование участвует в процессе выбора метода.</p>
5 <p>Посмотрим на код, который был в курсе про полиморфизм:</p>
5 <p>Посмотрим на код, который был в курсе про полиморфизм:</p>
6 <p>В этом коде проверка останавливается, если ничего не было найдено. Так было бы без наследования, но с ним поиск продолжается.</p>
6 <p>В этом коде проверка останавливается, если ничего не было найдено. Так было бы без наследования, но с ним поиск продолжается.</p>
7 <p>Сначала выбирается базовый класс для текущего, и метод ищется там. Если он не найден, то снова проверяется наличие __call__(). Затем процесс повторяется для родительского класса родителя текущего класса и далее до конца цепочки наследования.</p>
7 <p>Сначала выбирается базовый класс для текущего, и метод ищется там. Если он не найден, то снова проверяется наличие __call__(). Затем процесс повторяется для родительского класса родителя текущего класса и далее до конца цепочки наследования.</p>
8 <p>Из этого следует интересный вывод. Метод __call__ - это "тяжелый" вызов. Он требует больше вычислений для поиска. И чем ближе к началу иерархии расположен __call__(), тем хуже с точки зрения производительности.</p>
8 <p>Из этого следует интересный вывод. Метод __call__ - это "тяжелый" вызов. Он требует больше вычислений для поиска. И чем ближе к началу иерархии расположен __call__(), тем хуже с точки зрения производительности.</p>
9 <p>Теперь, когда мы осознали этот аспект, сравним позднее связывание и динамическую диспетчеризацию, чтобы понять их различия и влияние на код.</p>
9 <p>Теперь, когда мы осознали этот аспект, сравним позднее связывание и динамическую диспетчеризацию, чтобы понять их различия и влияние на код.</p>
10 <h2>Позднее связывание в сравнении с динамической диспетчеризацией</h2>
10 <h2>Позднее связывание в сравнении с динамической диспетчеризацией</h2>
11 <p>Часто разработчики путают позднее связывание и динамическую диспетчеризацию. Ситуация усложняется тем, что в некоторых языках, например, в Java, на уровне документации и сообщества одно понятие заменяется другим.</p>
11 <p>Часто разработчики путают позднее связывание и динамическую диспетчеризацию. Ситуация усложняется тем, что в некоторых языках, например, в Java, на уровне документации и сообщества одно понятие заменяется другим.</p>
12 <p><strong>Диспетчеризация</strong>- это процесс поиска и вызова необходимой функции или метода для уже известного типа данных.</p>
12 <p><strong>Диспетчеризация</strong>- это процесс поиска и вызова необходимой функции или метода для уже известного типа данных.</p>
13 <p>Динамическая диспетчеризация же представляет собой поиск необходимой функции во время исполнения программы, в отличие от статической, где поиск совершается во время компиляции.</p>
13 <p>Динамическая диспетчеризация же представляет собой поиск необходимой функции во время исполнения программы, в отличие от статической, где поиск совершается во время компиляции.</p>
14 <p>Связывание сообщает о том, что представляет собой идентификатор и какого он типа. Если связывание раннее, мы знаем об этом сразу. В случае позднего - только в момент выполнения кода.</p>
14 <p>Связывание сообщает о том, что представляет собой идентификатор и какого он типа. Если связывание раннее, мы знаем об этом сразу. В случае позднего - только в момент выполнения кода.</p>
15 <p>Например, в Python можно определить функцию после того, как она уже была использована где-то в коде. Это также является примером позднего связывания. В случае использования self в Python мы знаем, что это экземпляр текущего класса. Но мы не знаем точно, какого именно класса до момента выполнения этого кода.</p>
15 <p>Например, в Python можно определить функцию после того, как она уже была использована где-то в коде. Это также является примером позднего связывания. В случае использования self в Python мы знаем, что это экземпляр текущего класса. Но мы не знаем точно, какого именно класса до момента выполнения этого кода.</p>
16 <h2>Выводы</h2>
16 <h2>Выводы</h2>
17 <p>Различие между поздним связыванием и динамической диспетчеризацией является ключевым для понимания работы полиморфизма и наследования в Python. С пониманием этих концепций можно более эффективно использовать эти принципы в своем коде. Это приведет к созданию более мощных и гибких программ.</p>
17 <p>Различие между поздним связыванием и динамической диспетчеризацией является ключевым для понимания работы полиморфизма и наследования в Python. С пониманием этих концепций можно более эффективно использовать эти принципы в своем коде. Это приведет к созданию более мощных и гибких программ.</p>