HTML Diff
0 added 0 removed
Original 2026-01-01
Modified 2026-03-10
1 <ul><li><a>Полиморфизм в ООП - что это?</a></li>
1 <ul><li><a>Полиморфизм в ООП - что это?</a></li>
2 <li><a>Пример № 1</a></li>
2 <li><a>Пример № 1</a></li>
3 <li><a>Пример № 2</a></li>
3 <li><a>Пример № 2</a></li>
4 <li><a>Пример № 3</a></li>
4 <li><a>Пример № 3</a></li>
5 <li><a>Пример № 4</a></li>
5 <li><a>Пример № 4</a></li>
6 </ul><p><strong>Полиморфизм</strong>- важный принцип объектно-ориентированного программирования. Его знание часто требуют на технических собеседованиях, причем соискателя всегда могут спросить как про полиморфизм в общих чертах, так и про его специфику в контексте разработки на определенном языке (речь идет о полиморфизме в<strong>Java</strong>,<strong>"Питоне"</strong>и т. п.). В этой статье мы подробно остановимся на полиморфизме в Python, а также рассмотрим реализацию данного принципа ООП на различных примерах.</p>
6 </ul><p><strong>Полиморфизм</strong>- важный принцип объектно-ориентированного программирования. Его знание часто требуют на технических собеседованиях, причем соискателя всегда могут спросить как про полиморфизм в общих чертах, так и про его специфику в контексте разработки на определенном языке (речь идет о полиморфизме в<strong>Java</strong>,<strong>"Питоне"</strong>и т. п.). В этой статье мы подробно остановимся на полиморфизме в Python, а также рассмотрим реализацию данного принципа ООП на различных примерах.</p>
7 <h2>Полиморфизм в ООП - что это?</h2>
7 <h2>Полиморфизм в ООП - что это?</h2>
8 <p>Если говорить буквально, то слово polymorphism означает "множество форм".</p>
8 <p>Если говорить буквально, то слово polymorphism означает "множество форм".</p>
9 <p>То есть один и тот же человек может принимать много форм по аналогии изменения ролей актера в театре. Так и код в программировании - благодаря использованию вышеупомянутого принципа ООП, код становится более гибким, ведь на практике разработчик получает возможность использовать одну и ту же сущность (method, оператор либо объект) для представления разных типов в разных сценариях.</p>
9 <p>То есть один и тот же человек может принимать много форм по аналогии изменения ролей актера в театре. Так и код в программировании - благодаря использованию вышеупомянутого принципа ООП, код становится более гибким, ведь на практике разработчик получает возможность использовать одну и ту же сущность (method, оператор либо объект) для представления разных типов в разных сценариях.</p>
10 <h2>Пример № 1</h2>
10 <h2>Пример № 1</h2>
11 <p>Хорошо известно, что оператор “+” нередко применяют в программах, написанных на Python. Но использовать этот оператор можно по-разному.</p>
11 <p>Хорошо известно, что оператор “+” нередко применяют в программах, написанных на Python. Но использовать этот оператор можно по-разному.</p>
12 <p>Если мы говорим о целочисленных типах данных, то мы применяем “+” в целях сложения операндов:</p>
12 <p>Если мы говорим о целочисленных типах данных, то мы применяем “+” в целях сложения операндов:</p>
13 number1 = 1 number2 = 2 print(number1 + number2)<p>Такая программа выведет на экран цифру 3. Элементарно, Ватсон!</p>
13 number1 = 1 number2 = 2 print(number1 + number2)<p>Такая программа выведет на экран цифру 3. Элементарно, Ватсон!</p>
14 <p>Однако применять “+” можно и для конкатенации строк:</p>
14 <p>Однако применять “+” можно и для конкатенации строк:</p>
15 string1 = "Hello," string2 = "Otus!" print(string1+" "+string2)<p>Результат очевиден и здесь:</p>
15 string1 = "Hello," string2 = "Otus!" print(string1+" "+string2)<p>Результат очевиден и здесь:</p>
16 <p>Hello Otus!</p>
16 <p>Hello Otus!</p>
17 <p>Какой же вывод можно сделать из вышесказанного? У нас существует единственный оператор “+”, который способен выполнять<strong>разные операции для разных типов данных</strong>. Это является одним из наиболее простых примеров полиморфизма на "Пайтон".</p>
17 <p>Какой же вывод можно сделать из вышесказанного? У нас существует единственный оператор “+”, который способен выполнять<strong>разные операции для разных типов данных</strong>. Это является одним из наиболее простых примеров полиморфизма на "Пайтон".</p>
18 <h2>Пример № 2</h2>
18 <h2>Пример № 2</h2>
19 <p>В языке Python существуют функции, способные принимать аргументы различных типов. Пример такой функции - len(). Она способна принимать разные типы данных. Работает это следующим образом:</p>
19 <p>В языке Python существуют функции, способные принимать аргументы различных типов. Пример такой функции - len(). Она способна принимать разные типы данных. Работает это следующим образом:</p>
20 print(len("ООП-программирование")) print(len(["Python", "Java", "C#", "Scala", "C++"])) print(len({"Где изучить?": "В Otus", "Как проходят занятия?": "Онлайн"}))<p>Вывод будет необычен, но если разобраться, то все просто:</p>
20 print(len("ООП-программирование")) print(len(["Python", "Java", "C#", "Scala", "C++"])) print(len({"Где изучить?": "В Otus", "Как проходят занятия?": "Онлайн"}))<p>Вывод будет необычен, но если разобраться, то все просто:</p>
21 20 5 2<p>Причина в том, что функция len() может работать с разными типами данных: строкой, списком, кортежем, множеством, словарем. В результате в нашем случае одна и та же функция каждый раз возвратила специфичную информацию для каждого типа данных:</p>
21 20 5 2<p>Причина в том, что функция len() может работать с разными типами данных: строкой, списком, кортежем, множеством, словарем. В результате в нашем случае одна и та же функция каждый раз возвратила специфичную информацию для каждого типа данных:</p>
22 <ul><li>посчитала количество букв в слове "Программирование";</li>
22 <ul><li>посчитала количество букв в слове "Программирование";</li>
23 <li>посчитала количество слов в списке;</li>
23 <li>посчитала количество слов в списке;</li>
24 <li>посчитала количество ключей в словаре.</li>
24 <li>посчитала количество ключей в словаре.</li>
25 </ul><h2>Пример № 3</h2>
25 </ul><h2>Пример № 3</h2>
26 <p>Так как различные классы в "Питоне" способны иметь методы с одинаковым именем, то идея вполне подходит и для методов базового класса. Позже мы обобщим вызов данных методов и проигнорируем объект, с которым работаем.</p>
26 <p>Так как различные классы в "Питоне" способны иметь методы с одинаковым именем, то идея вполне подходит и для методов базового класса. Позже мы обобщим вызов данных методов и проигнорируем объект, с которым работаем.</p>
27 <p>Ниже - пример такого полиморфизма в методах класса:</p>
27 <p>Ниже - пример такого полиморфизма в методах класса:</p>
28 <p>Смотрим вывод в консоль:</p>
28 <p>Смотрим вывод в консоль:</p>
29 Мяу! Я кот. Меня зовут Васька. Мне 2 года. Мяу! Гав! Я собака. Меня зовут Мухтар. Мне 3 года. Гав!<p>У нас создано 2 класса: <strong>Cat </strong>и <strong>Dog</strong>. У этих классов структура похожа, плюс они имеют методы с одинаковыми именами:</p>
29 Мяу! Я кот. Меня зовут Васька. Мне 2 года. Мяу! Гав! Я собака. Меня зовут Мухтар. Мне 3 года. Гав!<p>У нас создано 2 класса: <strong>Cat </strong>и <strong>Dog</strong>. У этих классов структура похожа, плюс они имеют методы с одинаковыми именами:</p>
30 <ul><li>make_sound();</li>
30 <ul><li>make_sound();</li>
31 <li>info().</li>
31 <li>info().</li>
32 </ul><p>Но стоит отметить, что нам не пришлось создавать общий класс-родитель, как и не пришлось соединять эти классы вместе каким-нибудь иным методом. Для обоих случаев у нас используется общая переменная animal, что стало возможным благодаря наличию полиморфизма.</p>
32 </ul><p>Но стоит отметить, что нам не пришлось создавать общий класс-родитель, как и не пришлось соединять эти классы вместе каким-нибудь иным методом. Для обоих случаев у нас используется общая переменная animal, что стало возможным благодаря наличию полиморфизма.</p>
33 <h2>Пример № 4</h2>
33 <h2>Пример № 4</h2>
34 <p>Как и в прочих языках программирования, в "Питоне" классы-потомки способны выполнять наследование методов и атрибутов родительского класса. То есть у нас существует возможность переопределить ряд methods и attributes, сделав это для того, чтобы они соответствовали классу-потомку. Данное поведение называют<strong>переопределением (overriding)</strong>. И благодаря наличию полиморфизма мы можем получать доступ к переопределенным methods и attributes, имеющим такое же имя, как и в parent class.</p>
34 <p>Как и в прочих языках программирования, в "Питоне" классы-потомки способны выполнять наследование методов и атрибутов родительского класса. То есть у нас существует возможность переопределить ряд methods и attributes, сделав это для того, чтобы они соответствовали классу-потомку. Данное поведение называют<strong>переопределением (overriding)</strong>. И благодаря наличию полиморфизма мы можем получать доступ к переопределенным methods и attributes, имеющим такое же имя, как и в parent class.</p>
35 <p>Пример такого переопределения ниже:</p>
35 <p>Пример такого переопределения ниже:</p>
36 from math import pi class Shape: def __init__(self, name): self.name = name def area(self): pass def fact(self): return "Я - двумерная фигура" def __str__(self): return self.name class Square(Shape): def __init__(self, length): super().__init__("Квадрат") self.length = length def area(self): return self.length**2 def fact(self): return "Любой угол квадрата равен 90 градусов." class Circle(Shape): def __init__(self, radius): super().__init__("Круг") self.radius = radius def area(self): return pi*self.radius**2 a = Square(5) b = Circle(8) print(b) print(b.fact()) print(a.fact()) print(b.area())<p>Смотрим на вывод программы:</p>
36 from math import pi class Shape: def __init__(self, name): self.name = name def area(self): pass def fact(self): return "Я - двумерная фигура" def __str__(self): return self.name class Square(Shape): def __init__(self, length): super().__init__("Квадрат") self.length = length def area(self): return self.length**2 def fact(self): return "Любой угол квадрата равен 90 градусов." class Circle(Shape): def __init__(self, radius): super().__init__("Круг") self.radius = radius def area(self): return pi*self.radius**2 a = Square(5) b = Circle(8) print(b) print(b.fact()) print(a.fact()) print(b.area())<p>Смотрим на вывод программы:</p>
37 Круг Я - двумерная фигура Любой угол квадрата равняется 90 градусам. 201.06192982974676<p>В работе кода мы использовали методы __str__() - они не были переопределены в дочерних классах и применяются непосредственно из класса-родителя. То есть интерпретатор "Пайтона" автоматически распознал, что метод fact() для объекта a (class Square) является переопределенным. В результате применяется тот метод, который был определен в классе-потомке.</p>
37 Круг Я - двумерная фигура Любой угол квадрата равняется 90 градусам. 201.06192982974676<p>В работе кода мы использовали методы __str__() - они не были переопределены в дочерних классах и применяются непосредственно из класса-родителя. То есть интерпретатор "Пайтона" автоматически распознал, что метод fact() для объекта a (class Square) является переопределенным. В результате применяется тот метод, который был определен в классе-потомке.</p>
38 <p>В это же самое время, метод fact() для объекта b переопределенным не является, в результате чего применяется метод с таким же именем из parent class (Shape).</p>
38 <p>В это же самое время, метод fact() для объекта b переопределенным не является, в результате чего применяется метод с таким же именем из parent class (Shape).</p>
39 <p>Важно отметить, что в "Питоне" не поддерживается такой вариант<strong>method overriding</strong>, как создание методов с тем же самым именем, однако с различными типами аргументов.</p>
39 <p>Важно отметить, что в "Питоне" не поддерживается такой вариант<strong>method overriding</strong>, как создание методов с тем же самым именем, однако с различными типами аргументов.</p>
40 <p>Надеемся, теперь вы знаете достаточно, чтобы пройти собеседование. Если же интересуют подробности полиморфизма в<strong>Java</strong>, можете почитать, к примеру,<a>эту</a>статью. Если же хотите освоить какой-нибудь из вышеупомянутых языков программирования на профессиональном уровне, добро пожаловать на курсы в Otus!</p>
40 <p>Надеемся, теперь вы знаете достаточно, чтобы пройти собеседование. Если же интересуют подробности полиморфизма в<strong>Java</strong>, можете почитать, к примеру,<a>эту</a>статью. Если же хотите освоить какой-нибудь из вышеупомянутых языков программирования на профессиональном уровне, добро пожаловать на курсы в Otus!</p>
41 <a></a><a></a><p><em>Источник - https://www.programiz.com/python-programming/polymorphism.</em></p>
41 <a></a><a></a><p><em>Источник - https://www.programiz.com/python-programming/polymorphism.</em></p>
42  
42