【Python系列】Python装饰器

💝💝💝欢迎来到我的博客,很高兴能够在这里和您见面!希望您在这里可以感受到一份轻松愉快的氛围,不仅可以获得有趣的内容和知识,也可以畅所欲言、分享您的想法和见解。

  • 推荐:kwan 的首页,持续学习,不断总结,共同进步,活到老学到老
  • 导航
    • 檀越剑指大厂系列:全面总结 java 核心技术点,如集合,jvm,并发编程 redis,kafka,Spring,微服务,Netty 等
    • 常用开发工具系列:罗列常用的开发工具,如 IDEA,Mac,Alfred,electerm,Git,typora,apifox 等
    • 数据库系列:详细总结了常用数据库 mysql 技术点,以及工作中遇到的 mysql 问题等
    • 懒人运维系列:总结好用的命令,解放双手不香吗?能用一个命令完成绝不用两个操作
    • 数据结构与算法系列:总结数据结构和算法,不同类型针对性训练,提升编程思维,剑指大厂

非常期待和您一起在这个小小的网络世界里共同探索、学习和成长。💝💝💝 ✨✨ 欢迎订阅本专栏 ✨✨

博客目录

装饰器(Decorator)是 Python 中一种非常强大的功能,它允许程序员在不修改原始函数代码的前提下,增加函数的新功能。装饰器本质上是一个函数,它接收一个函数作为参数,并返回一个经过包装的函数,从而增强原有函数的功能。

1.装饰器的概念

在 Python 中,装饰器通常用@符号来表示,它位于函数定义之前。装饰器可以看作是一种设计模式,它遵循开放-封闭原则,即软件实体应该对扩展开放,对修改封闭。装饰器允许你通过增加新的功能来扩展函数,而不需要修改函数本身的代码。

2.装饰器的构成

一个装饰器通常包含以下三部分:

  1. 接收函数的函数:这是装饰器本身,它接收一个函数作为参数。
  2. 包装函数:这是装饰器内部定义的函数,它会调用接收到的函数,并可以添加额外的功能。
  3. 返回包装函数:装饰器执行完毕后,需要返回一个函数,通常是包装函数。

3.装饰器的语法

装饰器的基本语法如下:

python 复制代码
def decorator_function(original_function):
    def wrapper_function(*args, **kwargs):
        # 在这里添加额外的功能
        result = original_function(*args, **kwargs)
        # 在这里添加额外的功能
        return result
    return wrapper_function

@decorator_function
def original_function(*args, **kwargs):
    # 函数的原始功能
    pass

4.带参数的装饰器

有时候,我们希望装饰器本身也能接收参数,这就需要使用到闭包。带参数的装饰器语法如下:

python 复制代码
def decorator_function_with_args(arg1, arg2):
    def decorator(original_function):
        def wrapper(*args, **kwargs):
            # 使用装饰器参数
            print(arg1, arg2)
            result = original_function(*args, **kwargs)
            return result
        return wrapper
    return decorator

@decorator_function_with_args('arg1_value', 'arg2_value')
def original_function():
    pass

5.装饰器的应用场景

装饰器可以用于多种场景,包括但不限于:

  1. 日志记录:在函数执行前后添加日志记录。
  2. 性能测试:测量函数执行时间。
  3. 事务处理:确保数据库操作的原子性。
  4. 缓存:缓存函数的返回结果,避免重复计算。
  5. 权限校验:检查用户是否有执行函数的权限。
  6. 请求限流:限制函数在一定时间内的调用次数。

6.示例:日志记录装饰器

下面是一个简单的日志记录装饰器示例:

python 复制代码
import functools
import time

def log_decorator(func):
    @functools.wraps(func)
    def wrapper(*args, **kwargs):
        print(f"Calling {func.__name__}")
        start_time = time.time()
        result = func(*args, **kwargs)
        end_time = time.time()
        print(f"{func.__name__} executed in {end_time - start_time:.2f} seconds")
        return result
    return wrapper

@log_decorator
def add(a, b):
    time.sleep(1)  # 模拟耗时操作
    return a + b

result = add(5, 3)

7.装饰器的高级用法

除了基本用法,装饰器还可以用于类和类方法,甚至可以嵌套使用。此外,Python 标准库中的functools.wraps装饰器可以用来保留原函数的元数据,如函数名、文档字符串等。

8.结论

装饰器是 Python 中一个非常强大的工具,它提供了一种灵活、优雅的方式来增强函数的功能。通过使用装饰器,我们可以编写更加模块化、可重用的代码,同时保持代码的清晰和简洁。掌握装饰器的使用,对于提高 Python 编程技能和编写高质量代码具有重要意义。

觉得有用的话点个赞 👍🏻 呗。

❤️❤️❤️本人水平有限,如有纰漏,欢迎各位大佬评论批评指正!😄😄😄

💘💘💘如果觉得这篇文对你有帮助的话,也请给个点赞、收藏下吧,非常感谢!👍 👍 👍

🔥🔥🔥Stay Hungry Stay Foolish 道阻且长,行则将至,让我们一起加油吧!🌙🌙🌙

相关推荐
起名字真南15 分钟前
【OJ题解】C++实现字符串大数相乘:无BigInteger库的字符串乘积解决方案
开发语言·c++·leetcode
tyler_download26 分钟前
golang 实现比特币内核:实现基于椭圆曲线的数字签名和验证
开发语言·数据库·golang
小小小~27 分钟前
qt5将程序打包并使用
开发语言·qt
hlsd#27 分钟前
go mod 依赖管理
开发语言·后端·golang
哇咔咔哇咔27 分钟前
【科普】conda、virtualenv, venv分别是什么?它们之间有什么区别?
python·conda·virtualenv
小春学渗透29 分钟前
Day107:代码审计-PHP模型开发篇&MVC层&RCE执行&文件对比法&1day分析&0day验证
开发语言·安全·web安全·php·mvc
杜杜的man31 分钟前
【go从零单排】迭代器(Iterators)
开发语言·算法·golang
亦世凡华、32 分钟前
【启程Golang之旅】从零开始构建可扩展的微服务架构
开发语言·经验分享·后端·golang
测试界的酸菜鱼1 小时前
C# NUnit 框架:高效使用指南
开发语言·c#·log4j
GDAL1 小时前
lua入门教程 :模块和包
开发语言·junit·lua