说明
《Python 教程》 持续更新中,提供建议、纠错、催更等加作者微信: gairuo123(备注:pandas教程)和关注公众号「盖若」ID: gairuo。跟作者学习,请进入 Python学习课程。欢迎关注作者出版的书籍:《深入浅出Pandas》 和 《Python之光》。
Python 内置模块 functools 的一个高阶函数 @singledispatchmethod 可以将类中的方法单分派来定义泛型函数。要定义泛型方法,可以使用 @singledispatchmethod 装饰器对其进行装饰,使用 @singledispatchmethod 定义函数时,请注意,分派发生在第一个非 self 或非 cls 参数的类型上。这是 Python 3.8 新版功能。
与泛型函数类似,可以编写一个使用不同类型的参数调用的泛型方法声明,根据传递给通用方法的参数的类型,编译器会适当地处理每个方法调用。
关于泛型和单分派相关的内容可以查看 @singledispatch 函数单分派 的介绍理解。
先定义一个类,然后在类中定义一个泛型方法:
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
Negator 类 有一个名为 neg() 的实例方法。在默认情况下,neg() 函数会引发一个 NotImplementedError。但是,对于整数和布尔类型,该函数会被重载,并在这些情况下返回否定。执行脚本后的结果是是不能执行否操作。
@singledispatchmethod 支持与其他装饰器(如 @classmethod)嵌套,请注意,要允许使用 dispatcher.register,singledispatchmethod 必须是最外层的修饰符。以下是 neg 方法绑定到该类的 Negator 类,而不是该类的实例:
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、@abstractmethod 等。
更新时间:2022-01-20 21:38:04 标签:python 装饰器 方法 单分派