Язык программирования Python

       

Мультиметоды


Некоторые объектно-ориентированные "штучки" не входят в стандартный Python или стандартную библиотеку. Ниже будут рассмотрены мультиметоды - методы, сочетающие объекты сразу нескольких различных классов. Например, сложение двух чисел различных типов фактически требует использования мультиметода. Если "одиночный" метод достаточно задать для каждого класса, то мультиметод требует задания для каждого сочетания классов, которые он обслуживает:

>>> import operator >>> operator.add(1, 2) 3 >>> operator.add(1.0, 2) 3.0 >>> operator.add(1, 2.0) 3.0 >>> operator.add(1, 1+2j) (2+2j) >>> operator.add(1+2j, 1) (2+2j)

В этом примере operator.add ведет себя как мультиметод, выполняя разные действия для различных комбинаций параметров.

Для организации собственных мультиметодов можно воспользоваться модулем Multimethod (автор Neel Krishnaswami), который легко найти в Интернете. Следующий пример, адаптированный из документации модуля, показывает построение собственного мультиметода:

from Multimethod import Method, Generic, AmbiguousMethodError

# классы, для которых будет определен мультиметод class A: pass class B(A): pass

# функции мультиметода def m1(a, b): return 'AA' def m2(a, b): return 'AB' def m3(a, b): return 'BA'

# определение мультиметода (без одной функции) g = Generic() g.add_method(Method((A, A), m1)) g.add_method(Method((A, B), m2)) g.add_method(Method((B, A), m3))

# применение мультиметода try: print 'Типы аргументов:', 'Результат' print 'A, A:', g(A(), A()) print 'A, B:', g(A(), B()) print 'B, A:', g(B(), A()) print 'B, B:', g(B(), B()) except AmbiguousMethodError: print 'Неоднозначный выбор метода'



Содержание раздела