【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 道阻且长,行则将至,让我们一起加油吧!🌙🌙🌙

相关推荐
2301_8125396716 小时前
Golang怎么实现网页爬虫抓取数据_Golang如何用colly框架快速构建爬虫采集程序【教程】
jvm·数据库·python
xcbrand16 小时前
政府事业机构品牌策划公司哪家可靠
大数据·人工智能·python
代码中介商16 小时前
C++ 仿函数(Functor)深度解析:从基础到应用
开发语言·c++
小杍随笔17 小时前
Rust桌面GUI框架:性能优化与实战避坑指南
开发语言·性能优化·rust
二哈赛车手17 小时前
新人笔记---项目中简易版的RAG检索后评测指标(@Recall ,Mrr..)实现
java·开发语言·笔记·spring·ai
格林威17 小时前
3D相机视觉检测:环境光太强,结构光点云全是噪点怎么办?
开发语言·人工智能·数码相机·计算机视觉·3d·视觉检测·工业相机
Rust语言中文社区17 小时前
【Rust日报】2026-05-02 Temper - 用 Rust 编写的 Minecraft 服务器项目发布 0.1.0 版
运维·服务器·开发语言·后端·rust
爱滑雪的码农17 小时前
Java基础十一 流(Stream)、文件(File)和IO
java·开发语言·python
叶小鸡17 小时前
Java 篇-项目实战-天机学堂(从0到1)-day11
java·开发语言
格林威17 小时前
线阵工业相机:线阵图像出现“波浪纹”,是机械振动还是编码器问题?
开发语言·人工智能·数码相机·计算机视觉·视觉检测·工业相机·线阵相机