Generic 0.2
Выпустил версию 0.2 библиотеки generic.
Во-первых, написал хоть какую-то документацию по библиотеке.
Во-вторых, теперь появилась возможность создавать методы с мультидиспетчеризацией. Об этом чуточку подробнее.
Методы с мультидиспетчеризацией мало отличаются от функций с оной, о которых я уже рассказывал в предыдущем посте. Самое главное и единственное различие между ними — неявная диспетчеризация последних по типу (классу) метода.
Продемонстрирую это на следующем примере:
from generic.multidispatch import multimethod
from generic.multidispatch import has_multimethods
@has_multimethods
class A(object):
@multimethod(int)
def foo(self, x):
return x + 1
@has_multimethods
class B(A):
@A.foo.when(str)
def foo(self, x):
return x + "1"
A().foo(1) # 2
A().foo("str") # raises TypeError
B().foo(1) # 2
B().foo("str") # "str1"
Что из этого следует:
При наследовании, реализации мультиметодов также наследуются от базовых классов —
B().foo(1)работает и возвращает2.Наследники базового класса могут расширять определения мультиметодов новыми реализациями —
B().foo("str"). При этом, эти реализации не будут доступны в базовом классе — вызываетсяTypeError.
Последние утверждение и означает диспетчеризацию по классу метода. Кстати, именно поэтому необходим декоратор для класса has_multimethods — во время декларации метода сам класс ещё не сконструирован и нам нечего использовать для определения мультиметода.