полиморфизм
На вопрос о трех основных характеристиках объектно-ориентированного подхода почти каждый может ответить, что это поток:упаковка,наследовать,полиморфизм. Сегодня мы поговорим о полиморфизме в Python.
так называемыйполиморфизм: Это означает, что один и тот же метод экземпляра класса имеет разные проявления в разных ситуациях. Полиморфизм позволяет объектам с различной внутренней структурой использовать один и тот же внешний интерфейс. Это означает, что хотя конкретные операции различны для разных объектов, они (эти операции) могут вызываться одинаковым образом через общий класс.
я здесьПодробное объяснение шаблонов проектирования в Python: шаблоны стратегииРеализация шаблона стратегии подробно описана в этой статье, и шаблон стратегии представляет собой типичное полиморфное приложение.
Я не буду публиковать предыдущий код, вы можете проверить его в исходном тексте. Я все еще использую классический пример товарных скидок. В статье «Шаблон стратегии» я также реализовал традиционный шаблон стратегии в коде Python, а в таких языках, как Java или C#, метод реализации аналогичен. Вот код С#, я только что перечислил полку:
interface Promotion
{
double discount(Order order);
}
class FidelityPromo : Promotion // 第一个具体策略
{
// 为积分为1000或以上的顾客提供5%折扣
public double discount(Order order)
{
...
}
}
class BulkItemPromo : Promotion // 第二个具体策略
{
//单个商品为20个或以上时提供10%折扣
public double discount(Order order)
{
...
}
}
class LargeOrderPromo : Promotion // 第三个具体策略
{
//订单中的不同商品达到10个或以上时提供7%折扣
public double discount(Order order)
{
...
}
}
Как видите, сначала должен быть интерфейс (Promotion
), а затем каждая стратегия реализует этот интерфейс. Однако,В языке Python нет ключевого слова интерфейса, то есть в Python нет такого интерфейса, как java, C#.
При реализации статьи шаблона стратегии использованиеабстрактный базовый класс(Абстрактный базовый класс, ABC) для реализации интерфейса, это в основном для того, чтобы больше походить на java, C # и другие языки с точки зрения написания, и студентам, у которых есть основа этих языков, легко понять и сравнивать.
Абстрактные базовые классы были представлены в Python 2.6, через 15 лет после рождения языка Python. Мы не описываем здесь абстрактные базовые классы, потому чтоДаже сейчас очень мало кода использует абстрактные базовые классы.. Для полиморфизма в Python есть лучший способ — утиная типизация.
Протоколы и утиная типизация
так называемыйутиный типТо есть: если птица ходит как утка, плавает как утка и крякает как утка, то это утка. Концепция получила свое название от теста на уток, предложенного Джеймсом Уиткомбом Райли.
Маленькие друзья, впервые увидевшие это описание, должны быть растеряны.Чтобы понять утиный тип, мы должны упомянуть еще один термин - протокол.
В объектно-ориентированном программировании протокол — это неформальный интерфейс, набор методов, определенных только документами и соглашениями, поэтому протокол не может налагать обязательные ограничения, как формальный интерфейс. Философия Python заключается в том, чтобы максимально поддерживать базовый протокол.
В переводе на человеческий язык это так: в Python нет интерфейса, там, где нужно использовать интерфейс, вместо него используется протокол. Так называемый протокол на самом деле представляет собой набор методов, который имеет то же значение, что и методы, определенные в интерфейсе. Просто соглашение не является обязательным соглашением, если не соблюдать соглашение, то не беда, при запуске сообщит об ошибке.
Это упрощает понимание типов уток: «если птица ходит, как утка, плавает, как утка, и крякает, как утка», это означает, что протокол был соблюдён, «тогда это утка», что означает, что вы can Где используется «утка», замените на «эта птица». Разве это не полиморфизм?
Реализация шаблона стратегии с «утиной типизацией» также проста, как удаление абстрактного базового класса. (Вот почему абстрактный базовый класс используется редко, потому что также правильно удалить код.) Заинтересованные друзья могут сами попробовать код.
Пример протокола на Python
В Python существует множество протоколов, таких как протокол итератора, любая реализация, реализующая__iter__
а также__next__
Объект метода можно назвать итератором, но тип самого объекта не ограничен благодаря утиной типизации.
from collections import Iterable
from collections import Iterator
class MyIterator:
def __iter__(self):
pass
def __next__(self):
pass
print(isinstance(MyIterator(), Iterable))
print(isinstance(MyIterator(), Iterator))
вывод:
True
True
Эпилог
Утиная типизация — это стиль дизайна в динамически типизированных языках в языках программирования.Характеристики объекта определяются не родительским классом, а методами объекта.
Дело не в том, что Python не поддерживает полиморфизм, но сам Python является полиморфным языком.
Отсканируйте код, чтобы подписаться на мой официальный аккаунт
Python Road фермеров старого кода