Полиморфизм в классах Python 3

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

В объектно-ориентированном программировании Python это значит, что конкретный объект, принадлежащий определенному классу, может быть использован таким же образом, как если бы он был другим объектом, принадлежащим другому классу.

Полиморфизм делает код гибким, такой код легко расширять и поддерживать.

Данное руководство научит вас применять полиморфизм в классах Python.

Что такое полиморфизм?

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

Полиморфизм в Python основан на утиной типизации. Термин «утиная типизация» (также неявная типизация, или латентная типизация) произошёл от цитаты «Если это выглядит как утка, плавает как утка и крякает как утка, то это, возможно, и есть утка». Утиная типизация подразумевает определение пригодности объекта для конкретной цели. При использовании обычной типизации эта пригодность определяется типом объекта в отдельности, но в утиной типизации для этого используются методы и свойства рассматриваемого объекта. Иными словами, нужно проверить, крякает ли объект как утка, а не спрашивать, является ли объект уткой.

Если несколько классов содержат методы с одинаковыми именами, но реализуют их по-разному, эти классы являются полиморфными. Функция сможет оценить эти полиморфные методы, не зная, какой класс она вызывает.

Создание полиморфных классов

Для примера создайте пару классов и пару объектов. Чтобы у классов был общий интерфейс, создайте одноименные объекты с разной функциональностью.

Создайте файл polymorphic_fish.py и добавьте в него классы Shark и Clownfish с методами swim(), swim_backwards() и skeleton().

class Shark():
def swim(self):
print("The shark is swimming.")
def swim_backwards(self):
print("The shark cannot swim backwards, but can sink backwards.")
def skeleton(self):
print("The shark's skeleton is made of cartilage.")
class Clownfish():
def swim(self):
print("The clownfish is swimming.")
def swim_backwards(self):
print("The clownfish can swim backwards.")
def skeleton(self):
print("The clownfish's skeleton is made of bone.")

Классы Shark и Clownfish используют три одноименных метода с разной функциональностью.

На основе классов создайте объекты:

...
wally = Shark()
wally.skeleton()
casey = Clownfish()
casey.skeleton()

Запустите программу:

python polymorphic_fish.py
The shark's skeleton is made of cartilage.
The clownfish's skeleton is made of bone.

Итак, теперь у вас есть два объекта с общим интерфейсом.

Полиморфизм в методах классов

Чтобы посмотреть, как Python использует каждый из этих классов, создайте цикл for, который итерирует корсаж объектов. Затем можно вызвать методы, не указывая, к какому классу относится каждый из них. Достаточно просто указать, что такой метод существует.

...
wally = Shark()
casey = Clownfish()
for fish in (wally, casey):
fish.swim()
fish.swim_backwards()
fish.skeleton()

Теперь у вас есть два объекта, wally из класса Shark и casey из класса Clownfish. Цикл for итерирует методы swim(), swim_backwards() и skeleton() каждого объекта.

Запустите программу. Она выведет:

The shark is swimming.
The shark cannot swim backwards, but can sink backwards.
The shark's skeleton is made of cartilage.
The clownfish is swimming.
The clownfish can swim backwards.
The clownfish's skeleton is made of bone.

Цикл for сначала итерировал объект класса Shark, а затем объект класса Clownfish.

Как видите, Python использует эти методы, не зная точно, к какому классу относится каждый из них.

Полиморфизм в функциях

Также можно создать функцию для работы с объектами.

Создайте функцию in_the_pacific(), которая принимает объект fish. Несмотря на то, что объект называется fish, функция сможет принять любой существующий объект.


def in_the_pacific(fish):

Вызовите методы swim(), каждый из которых определён в отдельном классе.

def in_the_pacific(fish):
fish.swim()

Создайте экземпляры классов Shark и Clownfish, если вы не сделали этого ранее. Так вы сможете вызывать их действия с помощью функции in_the_pacific().

...
def in_the_pacific(fish):
fish.swim()
wally = Shark()
casey = Clownfish()
in_the_pacific(wally)
in_the_pacific(casey)

При запуске программы вы получите такой вывод:

The shark is swimming.
The clownfish is swimming.

Несмотря на то, что в функции in_the_pacific() указан случайный объект fish, функция смогла правильно обработать классы.

Tags: ,

Добавить комментарий