Итак, вы погружаетесь в программирование на Python и наткнулись на удивительную вещь под названием «полиморфизм». Звучит заманчиво, но поверьте, это не так сложно, как кажется. Полиморфизм — это гибкость и возможность повторного использования нашего кода. Давайте погрузимся и демистифицируем это вместе.

Что такое Полиморфизм? Полиморфизм позволяет нам обращаться с разными объектами так, как будто они принадлежат к одному семейству, даже если они имеют разные специфические характеристики. Думайте об этом как о способе использования общего интерфейса для выполнения различных действий над разными типами объектов. Это избавляет нас от написания повторяющегося кода и делает наши программы более адаптируемыми.

Динамическая типизация Python. В Python у нас есть классная вещь, которая называется «динамическая типизация». Это означает, что объекты могут менять свой тип во время работы программы. Это динамическое поведение делает полиморфизм в Python таким мощным. Мы можем легко переключаться между различными типами объектов и писать более выразительный код.

Как работает полиморфизм? Полиморфизм достигается с помощью двух основных концепций: наследования классов и переопределения методов.

Наследование классов: с помощью наследования классов мы можем создать иерархию классов. Каждый класс может наследовать атрибуты и методы от общего «суперкласса» или «родительского класса». Это наследование позволяет нам использовать общую функциональность среди связанных классов, сохраняя при этом гибкость для настройки определенного поведения в каждом классе.

Переопределение метода: переопределение метода подобно наделению подклассов особой силой. Это позволяет подклассу предоставлять собственную реализацию метода, унаследованного от суперкласса. Таким образом, хотя разные классы могут иметь одно и то же имя метода, они могут вести себя по-разному в зависимости от конкретных потребностей. Вот где происходит магия полиморфизма!

Практические примеры полиморфизма:

Абстрагирование поведения:

Представьте, что у вас есть несколько классов с общими функциями. Используя полиморфизм, вы можете определить общий интерфейс (набор методов), который должны реализовать эти классы.

  • Подумайте о группе животных, таких как собаки, кошки и птицы. Несмотря на то, что все они разные, все они могут издавать звуки. Полиморфизм позволяет относиться к ним одинаково, как будто все они принадлежат к одной и той же группе «животных, издающих звуки». У нас может быть правило, которое гласит: «Если это животное, попросите его издать звук». Таким образом, мы можем заставить разных животных издавать свои уникальные звуки без написания отдельных инструкций для каждого животного.
class Bird:
  def sound(self):
    print('The bird goes tweet tweet')

class Cat:
  def sound(self):
    print('The cat meowed')

animal1 = Bird()
animal2 = Cat()

animal1.sound() #The bird goes tweet tweet
animal2.sound() #The cat meowed

Обработка коллекций:

Полиморфизм упрощает работу с коллекциями, содержащими объекты разных типов. Вместо того, чтобы писать отдельный код для каждого типа объектов, вы можете обрабатывать их все одинаково на основе их общего интерфейса. Это делает ваш код более гибким и простым в обслуживании.

  • Представьте, что у вас есть коробка с игрушками, и каждая игрушка делает что-то свое. Вместо того, чтобы брать каждую игрушку по отдельности и играть с ней по-разному, мы можем относиться ко всем как к игрушкам и играть с ними вместе. Полиморфизм позволяет нам иметь правило, говорящее: «Если это игрушка, давайте с ней поиграем!» Таким образом, мы можем развлекаться с разными игрушками, не беспокоясь об их особенностях. Мы можем относиться ко всем одинаково, исходя из их общей «игрушечной» природы.
class Toy:
    def play(self):
        pass

class Car(Toy):
    def play(self):
        print("Vroom! I'm a fast car!")

class Robot(Toy):
    def play(self):
        print("Beep boop! I'm a dancing robot!")

class TeddyBear(Toy):
    def play(self):
        print("Hug me! I'm a cuddly teddy bear!")

# Create a collection of toys
toys = [Car(), Robot(), TeddyBear()]

# Play with each toy in the collection
for toy in toys:
    toy.play()

В приведенном выше примере мы определяем базовый класс Toy с методом play. Метод play предназначен для переопределения подклассами. Затем мы создаем определенные подклассы игрушек, такие как Car, Robot и Teddy Bear, каждый со своим собственным методом игры.

Затем мы создаем коллекцию с именем toys, которая содержит экземпляры различных игрушечных объектов (автомобиль, робот и плюшевый мишка).

Наконец, мы перебираем каждую игрушку в коллекции игрушек и вызываем метод play для каждой игрушки. Здесь в игру вступает полиморфизм. Несмотря на то, что мы вызываем один и тот же метод (play), каждый игрушечный объект ведет себя по-разному в зависимости от собственной реализации. Конечный результат:

#Vroom! I'm a fast car!
#Beep boop! I'm a dancing robot!
#Hug me! I'm a cuddly teddy bear!

Системы плагинов:

Системы плагинов подобны различным инструментам, которые можно поместить в специальный слот на машине. Каждый инструмент имеет свои уникальные особенности, но все они следуют набору правил или инструкций для правильной работы.

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

Придерживаясь этого интерфейса, различные плагины могут легко встраиваться в машину без изменения основной структуры машины. Они легко интегрируются и предоставляют дополнительные функции без необходимости изменения основного кода машины.

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

Таким образом, полиморфизм в системах плагинов заключается в создании общего основания или набора инструкций, которым могут следовать плагины, что позволяет легко добавлять новые функции, не затрагивая ядро ​​программы.

  • Представьте себе коробку из разноцветных блоков, которые можно соединить вместе. Каждый блок имеет свою форму и цвет. С помощью полиморфизма мы можем создать правило, которое гласит: «Если это блок, его можно соединить с другими блоками». Это означает, что мы можем смешивать и сочетать различные блоки для создания уникальных структур, не требуя специальных инструкций для каждого блока. У нас могут быть блоки разных форм и размеров, но все они могут соединяться вместе, потому что подчиняются одному и тому же правилу.
class Block:
    def connect(self):
        pass

class BlueBlock(Block):
    def connect(self):
        print("Connecting the blue block...")

class RedBlock(Block):
    def connect(self):
        print("Connecting the red block...")

class YellowBlock(Block):
    def connect(self):
        print("Connecting the yellow block...")

# Create a collection of blocks
blocks = [BlueBlock(), RedBlock(), YellowBlock()]

# Connect each block in the collection
for block in blocks:
    block.connect()

В этом примере мы определяем базовый класс Block с методом подключения. Этот метод предназначен для переопределения подклассами. Затем мы создаем определенные подклассы блоков, такие как BlueBlock, RedBlock и YellowBlock, каждый со своей собственной реализацией метода соединения.

Затем мы создаем коллекцию блоков, которая содержит экземпляры различных блочных объектов. У нас есть синий блок, красный блок и желтый блок в коллекции.

Наконец, мы перебираем каждый блок в коллекции блоков и вызываем метод подключения для каждого блока. Здесь в игру вступает полиморфизм. Несмотря на то, что мы вызываем один и тот же метод (connect), каждый блочный объект ведет себя по-разному в зависимости от его собственной реализации. Вывод будет:

#Connecting the blue block...
#Connecting the red block...
#Connecting the yellow block...

В этих примерах полиморфизм позволяет нам группировать объекты на основе их общих характеристик или поведения. Это избавляет нас от написания повторяющихся инструкций и позволяет более гибко и творчески работать с различными объектами. Точно так же, как животные могут издавать звуки, с игрушками можно играть и блоки можно соединять, полиморфизм помогает нам одинаково относиться к разным вещам и делает наши программы более увлекательными и адаптируемыми!

Обработка коллекций и систем плагинов выглядит одинаково, что дает?

Давайте рассмотрим явные различия:

Обработка коллекций. Когда мы обрабатываем коллекции с помощью полиморфизма, мы группируем разные объекты вместе, как игрушки в ящике для игрушек. Мы относимся ко всем им так, как будто они принадлежат к одной и той же категории, даже если они могут быть разными. Мы можем выполнять действия над этими объектами, не беспокоясь об их конкретных типах. Например, мы можем заставить играть каждую игрушку в коллекции, даже если это разные игрушки со своими уникальными действиями.

Системы плагинов.Системы плагинов, использующие полиморфизм, подобны добавлению дополнительных функций в основную программу без изменения ее основного кода. Мы определяем набор правил или требований, которым должны следовать эти дополнительные функции (плагины). Каждый плагин может иметь собственную реализацию этих правил. Это позволяет нам подключать различные плагины к основной программе, и они без проблем работают вместе, следуя одному и тому же набору правил. Это похоже на добавление новых инструментов в набор инструментов без изменения самого набора инструментов.

В двух словах, обработка коллекций с полиморфизмом заключается в обработке различных объектов в коллекции, как если бы они принадлежали к одной и той же группе, в то время как системы плагинов с полиморфизмом предполагают добавление дополнительных функций в программу гибким и согласованным образом.

Вывод:

Полиморфизм в Python позволяет сделать ваш код гибким, пригодным для повторного использования и более простым в работе. Функция динамической типизации Python, наряду с наследованием классов и переопределением методов, позволяет нам достичь такой гибкости. Воспользуйтесь силой полиморфизма, и вы откроете новые возможности в своем путешествии по программированию на Python!

Ресурсы:



Полиморфизм в Python — GeeksforGeeks
Что такое полиморфизм: Слово «полиморфизм
означает наличие множества форм. В программировании полиморфизм означает то же самое…www.geeksforgeeks.org»



https://towardsdatascience.com/polymorphism-in-python-fundamentals-for-data-scientists-9dc19071da55