Реализация метода .meth() с помощью Foo и Bar
class Foo: def meth(self, arg): if <<arg is a Foo>
>
: ...FooFoo code block... elif <<arg is a Bar>
>
: ...FooBar code block... class Bar: def meth(self, arg): if <<arg is a Foo>
>
: ...BarFoo code block... elif <<arg is a Bar>
>
: ...BarBar code block... # Function to utilize Foo/Bar single-dispatch polymorphism def x_with_y(x, y): if <<x is Foo or Bar>
>
and <<y is Foo or Bar>
>
: x.meth(y) else: raise TypeError,"x, y must be either Foo's or Bar's"
Имеется пять различных ветвей/блоков кода, которые могут выполняться при вызове x_with_y(). Если типы x и y не подходят, возбуждается исключение (разумеется, вы могли бы сделать что-нибуль другое). Но, предполагая, что с типами все в порядке, ветвь кода выбирается сначала посредством полиморфной диспетчеризации, а затем посредством процедурного переключения. Кроме того, переключения внутри определений Foo.meth() и Bar.meth() в значительной степени эквивалентны. Полиморфизм - в разновидности с единичной диспетчеризацией - решает лишь половину задачи.