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

python的装饰器

Python 装饰器是一种特殊的函数,它可以接受一个函数作为输入,并返回一个新的函数,用于增强或修改原函数的功能
装饰器在不修改原函数代码的前提下,为函数添加额外的功能,比如日志记录、性能测试、权限验证等

语法

装饰器的语法使用 @ 符号,它通常放在被装饰函数的定义之前:

def my_decorator(func):
    def wrapper():
        print("在函数执行之前做一些事情")
        func()
        print("在函数执行之后做一些事情")
    return wrapper

@my_decorator
def say_hello():
    print("Hello!")

say_hello()

my_decorator 是一个装饰器函数,say_hello 是被装饰的函数
@my_decorator 这一行代码相当于执行了 say_hello = my_decorator(say_hello)

原理

装饰器本质上是一个高阶函数,即一个可以接受函数作为参数并返回函数的函数。当使用 @ 语法应用装饰器时,Python 会自动将被装饰的函数作为参数传递给装饰器函数,并将装饰器函数返回的新函数赋值给原来的函数名

my_decorator 接受 say_hello 函数作为参数,返回一个新的函数 wrapper
当调用 say_hello() 时,实际上调用的是 wrapper(),在 wrapper 函数内部,会先执行一些额外的操作,然后调用原函数 func()(即 say_hello),最后再执行一些其他操作

处理带参数的函数

如果被装饰的函数带有参数,装饰器中的 wrapper 函数也需要能够接受这些参数。可以使用 *args**kwargs

def my_decorator(func):
    def wrapper(*args, **kwargs):
        print("在函数执行之前做一些事情")
        result = func(*args, **kwargs)
        print("在函数执行之后做一些事情")
        return result
    return wrapper

@my_decorator
def add(a, b):
    return a + b

result = add(3, 5)
print(result)

wrapper 函数使用 *args**kwargs 来接受任意数量的位置参数和关键字参数,并将它们传递给原函数 func

带参数的装饰器

装饰器本身也可以接受参数。这需要在原有的装饰器基础上再嵌套一层函数:

def repeat(n):
    def decorator(func):
        def wrapper(*args, **kwargs):
            for _ in range(n):
                result = func(*args, **kwargs)
            return result
        return wrapper
    return decorator

@repeat(3)
def say_hi():
    print("Hi!")

say_hi()

repeat 是一个接受参数 n 的函数,它返回一个装饰器 decorator
decorator 再返回 wrapper 函数,wrapper 函数会重复调用原函数 n 次

应用场景

日志记录:记录函数的调用信息,如调用时间、参数等
性能测试:测量函数的执行时间
权限验证:在函数执行前验证用户的权限
缓存:缓存函数的结果,避免重复计算

总结

Python 装饰器是一种强大而灵活的工具,它可以帮助开发人员编写更加模块化、可复用和易于维护的代码

相关文章:

  • 降序排序算法
  • POI 和 EasyExcel
  • Altium Designer 23原理图编译Net XXX has no driving source警告
  • 【iOS】包大小和性能稳定性优化
  • B. Make It Increasing
  • 【phpstudy】关于实现两个不同版本的mysql并存。
  • SpringBoot速成(12)文章分类P15-P19
  • JAVA集合
  • python 视频处理库moviepy 设置字幕
  • 【LeetCode Hot100 矩阵】矩阵置零、螺旋矩阵、旋转图像、搜索二维矩阵II
  • 开源协议深度解析:理解MIT、GPL、Apache等常见许可证
  • JavaScript 简介
  • 枚举类型Enum
  • DeepSeek-R1 + Cherry Studio 本地部署打造个人 AI 知识库
  • C语言01
  • Kimi k1.5:继Deepseek R1 后多模态 AI 的新标杆
  • 低成本、高效率且成熟的电商实时数据采集方案:梦想成真?
  • 放大镜效果
  • 图论算法篇:邻接矩阵以及邻接表和链式前向星建图
  • winfrom实现人脸识别比对功能
  • 中国经济新动能|警惕数字时代下经济的“四大极化”效应
  • 前瞻|美联储明晨“按兵不动”几无悬念:关税战阴霾下,会否释放降息信号
  • 又一日军“慰安妇”制度受害者去世,大陆登记在册幸存者仅剩7人
  • 外交部介绍中国赞比亚共同举办人工智能能力建设主题活动情况
  • 央行行长详解降息:将通过利率自律机制引导商业银行相应下调存款利率
  • 全军军级以上单位新任纪委书记监委主任培训班结业