Статические языки в первую очередь зависят от наследства как носителя для реализации полиморфизма. Динамические языки, с другой стороны, зависят от утиной печати. Duck typing поддерживает полиморфизм без использования наследования. В этом контексте вам нужен один и тот же набор соответствующих методов, которые должны быть реализованы в каждом из классов расширения.
От страницы типизации википедии утка
class Duck:
def quack(self):
print("Quaaaaaack!")
def feathers(self):
print("The duck has white and gray feathers.")
class Person:
def quack(self):
print("The person imitates a duck.")
def feathers(self):
print("The person takes a feather from the ground and shows it.")
def name(self):
print("John Smith")
def in_the_forest(duck):
duck.quack()
duck.feathers()
def game():
donald = Duck()
john = Person()
in_the_forest(donald)
in_the_forest(john)
game()
Try думать в объектах с протоколом (набор методов) и взаимозаменяемостью между тем, с тем же протоколом.
duck typing definition из python.org:
Стиль программирования, который не смотрит на тип объекта, чтобы определить , если он имеет правильный интерфейс; вместо этого метод или атрибут просто вызывается или используется («Если он выглядит как утка и крякает, как утка, это должна быть утка».) Подчеркивая интерфейсы , а не конкретные типы, хорошо продуманный код улучшает его гибкость, позволяя полиморфное замещение. Утиная печать позволяет избежать тестов с использованием типов() или isinstance(). (Обратите внимание, однако, что утка-типизация может быть дополнена абстрактными базовыми классами.) Вместо этого обычно использует тесты hasattr() или EAFP.