Компьютерные ученые скажут вам, что существует несколько различных типов полиморфизма. Тип, на который ссылается ваш пример, - это способность ссылки на объект ссылаться на различные типы объектов во время выполнения программы, и когда метод вызывается по этой ссылке, правильная реализация этого метода вызывается на основе фактического текущего типа этого объекта. В Python ссылка на объект - это просто переменная, которой был присвоен объект, например, b
в следующем: b = B()
.
В то время как ваш пример, строго говоря, делает продемонстрировать полиморфизм в том смысле, что вы передаете два объекта разных классов в commmon_interface
и можете вызывать метод func
для этих двух разных объектов, это не лучший пример, поскольку оба объекта имеют одинаковую точную реализацию этого метод. Следующий пример будет более понятен для студента:
class B():
def func():
do_something_1()
class C():
def func():
do_something_2()
def foo(obj):
obj.func()
foo(B())
foo(C())
В методе foo
ссылка obj
ссылается один раз на объект класса B
и один раз на класс C
во время выполнения программа. Когда вызывается метод func
, будут вызваны две разные реализации . Поэтому, хотя это не является обязательной особенностью полиморфизма, это лучший пример, который описывает его полезность.
В статически типизированных языках, таких как C++
и Java
, полиморфизм ограничен publi c наследование. Например, если я объявляю P
указателем на объект класса A
, то я могу только присвоить P
ссылки на объекты класса A
или потомков A
в иерархии наследования publi c. Но в Python, с указанием утки, такого ограничения нет. Ваш пример может предложить иное.