当前位置: 首页 > article >正文

python语言基础-5 进阶语法-5.2 装饰器-5.2.5 装饰器使用案例(自定义装饰器实现方法重载)

声明:本内容非盈利性质,也不支持任何组织或个人将其用作盈利用途。本内容来源于参考书或网站,会尽量附上原文链接,并鼓励大家看原文。侵删。

5.2.5 装饰器使用案例-自定义装饰器实现方法重载

python中提供了@singledispatchmethod装饰器实现了单分派的泛型函数(函数重载)。如下:

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是根据函数参数列表的第一个参数类型不同来确定走哪个重载分支的。但在对于类中的方法,其第一个参数都是self或cls,因此这个装饰器不能再使用了。当python版本小于3.8时,没有提供其他的支持泛型函数的装饰器。@singledispatchmethod装饰器内层函数原码如下:

def wrapper(*args, **kw):
    return dispatch(args[0].__class__)(*args, **kw)

# 可以看到取的是第一个参数

当python版本小于3.8时,我们想要实现类中的泛型函数,需要重写@singledispatchmethod的wrapper函数,将args[0]修改为args[1]。代码如下:

from functools import singledispatch, update_wrapper

# 借助@singledispatchmethod的wrapper重新定义一个装饰器
def methdispatch(func):
    dispatcher = singledispatch(func)
    def wrapper(*args, **kw):
        return dispatcher.dispatch(args[1].__class__)(*args, **kw)
    wrapper.register = dispatcher.register
    update_wrapper(wrapper, func)
    return wrapper


# 测试使用装饰器
class Negator:
@methdispatch
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

if __name__ == '__main__':
neg = Negator()
neg.neg(1)
neg.neg(False)

http://www.kler.cn/a/401588.html

相关文章:

  • 前端接入Paymax支付请求
  • Apache和HTTPS证书的生成与安装
  • 每日一练:【动态规划算法】斐波那契数列模型之第 N 个泰波那契数(easy)
  • 面试题: Spring中的事务是如何实现的?
  • 20241116解决在WIN11和ubuntu20.04通过samba共享时出现局域网千兆带宽拉满的情况
  • 基于 MONAI 的 3D 图像分割任务2(Brain Tumour 和 SwinUNETR 训练)
  • 【青牛科技】视频监控器应用
  • CSV 文件读取
  • 机器学习的全面解析:从基础到应用
  • # JVM学习
  • 基于YOLOv8深度学习的婴儿情绪状态检测系统(PyQt5界面+数据集+训练代码)
  • Ubuntu20.04 Rk3588 交叉编译ffmpeg7.0
  • 疫情下的图书馆管理系统:Spring Boot实现
  • 【MCU】GD32H7定时器使用外部时钟源
  • 01 IP路由基础
  • 集群聊天服务器(13)redis环境安装和发布订阅命令
  • 电子应用设计方案-13:智能消毒柜系统方案设计
  • 【LangChain】LangChain框架快速入门
  • html本地离线引入vant和vue2(详细步骤)
  • 《Python制作动态爱心粒子特效》
  • 【C语言】操作符2(含操作符的应用)
  • 小学知识相关链接
  • 阿里云轻量应用服务器可以用在哪些场景呢
  • 《YOLO:目标检测领域的璀璨之星》
  • 网络安全之信息收集-实战-2
  • 青训营刷题笔记09