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

Python中的装饰器

文章目录

    • 装饰器
    • 普通装饰器
    • 带参数的装饰器
    • warps 保持函数源信息不变

装饰器

普通装饰器

原理就是闭包,被装饰器装饰的函数,通过闭包返回新的函数内存地址

from functools import wraps

# 不进行装饰
def ldsx():
    print('执行过程')
    return 'Data'

# fun就是被装饰的函数名
def decorator_func(fun):
    def rela_func(*args,**kwargs):
        data = fun()
        data+='_扩展'
        print('执行过程扩展')
        return data
    # 返回函数名
    return rela_func

# 使用装饰器装饰
@decorator_func
def ldsx_fun():
    print('执行过程')
    return 'Data'

if __name__ == '__main__':
    data  = ldsx()
    print(data)
    data = ldsx_fun()
    # 查看返回值,并且查看ldsx_fun的实际函数名
    print(data,ldsx_fun.__name__)
    
# 非装饰器原始
# 执行过程
# Data
# 使用装饰器
# 执行过程
# 执行过程扩展
# Data_扩展 rela_func

调用ldsx_func()可以写成decorator_func(ldsx_fun)() decorator_func(ldsx_fun)等价于 rela_func 然后再调用rela_func(),所以使用 ldsx_fun(),相当于使用rela_func()

带参数的装饰器

def decorator_func_args(ags):
    def decorator_func_rel(fun):
        def rela_func(*args,**kwargs):
            data = fun(*args,**kwargs)
            data+='_扩展'
            print('执行过程扩展')
            if ags == 'ldsx':
                print("装饰器参数开启 增加此扩展")
            return data
        return rela_func
    return decorator_func_rel


@decorator_func_args('ldsx')
def ldsx_fun_new(a,b):
    print('执行过程')
    print(a+b)
    return 'Data'


if __name__ == '__main__':
    data = ldsx_fun_new(1,2)
    print(data, ldsx_fun_new.__name__)

#打印
'''
执行过程
3
执行过程扩展
装饰器参数开启 增加此扩展
Data_扩展 rela_func
'''

装饰器函数多一层,用于接受装饰器参数,其余逻辑与普通装饰器一致

相当于decorator_func_args(‘ldsx’) -->decorator_func_rel(ldsx_fun_new)–>rela_func(1,2)

warps 保持函数源信息不变

由上文可见最后的函数名称其实都已经变了 如 ldsx_fun_new._name_ 得到的函数名rela_func

from functools import wraps

def decorator_func_args(ags):
    def decorator_func_rel(fun):
    	# warps会保持fun的元数据不变 
        @wraps(fun)
        def rela_func(*args,**kwargs):
            data = fun(*args,**kwargs)
            data+='_扩展'
            print('执行过程扩展')
            if ags == 'ldsx':
                print("装饰器参数开启 增加此扩展")
            return data
        return rela_func
    return decorator_func_rel
    
if __name__ == '__main__':
    print(ldsx_fun_new.__name__)
# 返回内容为ldsx_fun_new

相关文章:

  • 刘火良FreeRTOS内核实现与应用学习之6——多优先级
  • 蓝桥杯备考:模拟算法之排队接水
  • skynet.socket.limit 使用详解
  • 数据结构每日一题day5(顺序表)★★★★★
  • 为mariadb和mysql添加用户和修改密码的方法
  • 树莓派 —— 在树莓派4b板卡下编译FFmpeg源码,支持硬件编解码器(mmal或openMax硬编解码加速)
  • 清华大学第10讲:迈向未来的AI教学实验396页PPT 探索未来教育的无限可能|附PPT下载方法
  • 毕业设计:实现一个基于Python、Flask和OpenCV的人脸打卡Web系统(六)
  • 2025年最新自动化/控制保研夏令营预推免面试真题分享(东南大学苏州校区/华东理工/南航/天大)
  • 封装了一个支持多个分区的iOS自适应动态宽度layout
  • 探索MVC、MVP、MVVM和DDD架构在不同编程语言中的实现差异
  • 自然语言处理|人工智能如何革新作文批改:技术全解析
  • PyTorch 深度学习实战(27):扩散模型(Diffusion Models)与图像生成
  • LearnOpenGL(九)自定义转换类
  • 在 Ubuntu 上安装 Docker 的完整指南
  • 核心:一多开发项目搭建
  • 链表(1)
  • 浅谈Binder的个人理解
  • windows第十八章 菜单、工具栏、状态栏
  • 单元测试之Arrange-Act-Assert(简称AAA)
  • 人民日报民生观:转人工客服,怎么这么难?
  • 阿尔巴尼亚执政党连续第四次赢得议会选举,反对党此前雇用特朗普竞选经理
  • Manus向全球用户开放注册
  • 沈阳卫健委通报“健康证”办理乱象:涉事医院已被立案查处
  • 中美是否计划讨论美方以芬太尼为由对华征收的特别关税?外交部回应
  • 习近平出席中国-拉美和加勒比国家共同体论坛第四届部长级会议开幕式