import functools singledispatchmethod(func) @singledispatchmethod
func
- метод, которой следует сделать универсальным.Декоратор singledispatchmethod()
модуля functools
создает из обычного метода класса - универсальный метод одиночной диспетчеризации.
Чтобы определить универсальный метод, оберните его с помощью декоратора @singledispatchmethod
. Обратите внимание, что в перегруженные реализации передается тип первого аргумента, а не-self или non-cls:
class Negator: @singledispatchmethod def neg(self, arg): raise NotImplementedError("Cannot negate a") @neg.register def _(self, arg: int): return -arg @neg.register def _(self, arg: bool): return not arg
Декоратор @singledispatchmethod
поддерживает вложение с другими декораторами, такими как @classmethod
. Обратите внимание, что для использования dispatcher.register
, декоратор @singledispatchmethod
должен быть внешним. Вот класс Negator
с методом neg
, привязанным к классу:
class Negator: @singledispatchmethod @classmethod def neg(cls, arg): raise NotImplementedError("Cannot negate a") @neg.register @classmethod def _(cls, arg: int): return -arg @neg.register @classmethod def _(cls, arg: bool): return not arg
Тот же шаблон может быть использован для других подобных декораторов, например @staticmethod
и других.