Python 装饰器函数(decoratots)全解析

 更新时间:2026年01月24日 10:13:30   作者:重楼七叶一枝花_1200  
Python装饰器是一种高阶函数,用于在不修改原函数代码的前提下,增强函数功能,它通过闭包实现,可以实现日志记录、性能分析、权限控制和缓存等功能,本文介绍Python 装饰器函数(decoratots) 学习笔记,感兴趣的朋友一起看看吧

是什么

装饰器 = 一个函数,它接收另一个函数作为参数,并返回一个新的函数(通常通过闭包实现)
本质是高阶函数 + 闭包,用于在不修改原函数代码的前提下,增强函数功能

Python 装饰器(decorator)是一种以函数 / 类作为参数、并返回新函数 / 类的高阶工具(springAop),
它可以在不修改被装饰对象源码和调用方式的前提下,为其添加额外功能(如日志、计时、权限校验等)。
补充一句通俗理解:
装饰器就像给函数 / 类 “穿一件外套”,外套自带额外功能,不改变衣服本身,却能让衣服拥有新的特性。

Spring的前置后置通知

装饰器的语法使用 @decorator_name 来应用在函数或方法上。

Python 还提供了一些内置的装饰器,比如 @staticmethod 和 @classmethod,用于定义静态方法和类方法。

能干嘛

日志记录: 装饰器可用于记录函数的调用信息、参数和返回值。

性能分析: 可以使用装饰器来测量函数的执行时间。

权限控制: 装饰器可用于限制对某些函数的访问权限。

缓存: 装饰器可用于实现函数结果的缓存,以提高性能。

函数装饰器完整工作流程

绑定(传入原函数)→ 定义包装(封装额外功能)→ 替换(返回包装函数)→ 调用(执行包装逻辑 + 原函数逻辑)

案例代码

"""
装饰器(decorators)是 Python 中的一种高级功能,它允许你动态地修改函数或类的行为。
装饰器是一种函数,它接受一个函数作为参数并返回一个新的函数或修改原来的函数。
本质上是一个接收函数作为输入并返回一个新的包装过后的函数的对象。
"""
# 1 基础使用
# my_decorator 是一个装饰器函数,它接受say_hello函数作为参数并返回 wrapper 函数。
def my_decorator(original_function):
    def wrapper():
        print("在原函数之前执行")
        original_function()
        print("在原函数之后执行")
    return wrapper
# my_decorator注解将 say_hello 替换为 wrapper
@my_decorator
def say_hello():
    print("Hello!")
say_hello()
print("*" * 10)
# 2 带参数的装饰器
def my_decorator_v2(original_function):
    def wrapper(*args, **kwargs):
        print("在原函数之前执行")
        original_function(*args, **kwargs)
        print("在原函数之后执行")
    return wrapper
@my_decorator_v2
def say_bye(name):
    print(f"Hello, {name}!")
say_bye("李四")
import time
# 步骤1:定义装饰器函数(接收被装饰的函数作为参数)
def timer_decorator(original_function):
    # 步骤2:定义嵌套的包装函数(封装额外功能,调用原函数)
    def wrapper():
        # 额外功能:记录开始时间
        start_time = time.time()
        print("在原函数之前执行")
        # 调用被装饰的原函数,保留其核心功能
        result = original_function()
        print("在原函数之后执行")
        # 额外功能:计算并打印耗时
        end_time = time.time()
        print(f"函数 {original_function.__name__} 执行耗时:{end_time - start_time:.6f} 秒")
        # 返回原函数的执行结果,保证被装饰函数的返回值不丢失
        return result
    # 步骤3:返回包装函数(而非直接执行,保留包装逻辑供后续调用)
    return wrapper
# 步骤4:定义被装饰的目标函数(核心业务逻辑)
def my_business_func():
    time.sleep(0.5)  # 模拟耗时操作
    print("核心业务逻辑执行完成")
    return "执行成功"
# 步骤5:手动应用装饰器
my_business_funcVar = timer_decorator(my_business_func)
print(my_business_funcVar)
# 调用装饰后的函数
result = my_business_funcVar()
print("函数返回值:", result)
def timer_decorator(original_function):
    # 包装函数添加 *args 和 **kwargs,兼容任意参数
    def wrapper(*args, **kwargs):
        start_time = time.time()
        # 调用原函数时传入参数,保证核心逻辑正常执行
        result = original_function(*args, **kwargs)
        end_time = time.time()
        print(f"函数 {original_function.__name__} 执行耗时:{end_time - start_time:.6f} 秒")
        return result
    return wrapper
@timer_decorator
def my_business_func(name, age=20):
    time.sleep(0.5)
    print(f"核心业务逻辑:姓名{name},年龄{age}")
    return f"{name} 业务执行成功"
# 带参数调用,装饰器正常工作
result = my_business_func("张三", age=25)
print("函数返回值:", result)

多层装饰器

def log(func):
    @wraps(func)
    def wrapper(*args, **kwargs):
        print(f"Log: {func.__name__}")
        return func(*args, **kwargs)
    return wrapper
def timer(func):
    @wraps(func)
    def wrapper(*args, **kwargs):
        start = time.time()
        result = func(*args, **kwargs)
        print(f"Timer: {time.time() - start:.4f}s")
        return result
    return wrapper
@log
@timer
def add(a, b):
    return a + b
add(3, 4)  # 先执行 log,再执行 timer

💡 执行顺序
装饰器从下往上应用(@log 先于 @timer 被写,但实际执行时 timer 先包裹 add,然后 log 包裹 timer 的返回值)

到此这篇关于Python 装饰器函数(decoratots) 学习笔记的文章就介绍到这了,更多相关Python 装饰器函数内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • Python绘制圆形方法及turtle模块详解

    Python绘制圆形方法及turtle模块详解

    这篇文章主要给大家介绍了关于Python绘制圆形方法及turtle模块详解的相关资料,Turtle库是Python语言中一个很流行的绘制图像的函数库,文中介绍的非常详细,需要的朋友可以参考下
    2023-12-12
  • pycharm中执行.sh文件的方法步骤

    pycharm中执行.sh文件的方法步骤

    本文主要介绍了pycharm中执行.sh文件的方法步骤,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2023-02-02
  • 两种方法检查Python中的变量是否为字符串

    两种方法检查Python中的变量是否为字符串

    在 Python 中,每个变量都有一个数据类型, 数据类型表示变量内部存储的数据类型,本文通过示例介绍两种不同的方法来检查 Python 中的变量是否为字符串,感兴趣的朋友一起看看吧
    2023-11-11
  • 关于使用python反编译apk签名出包的问题

    关于使用python反编译apk签名出包的问题

    这篇文章主要介绍了使用python反编译apk签名出包,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2021-03-03
  • 以一段代码为实例快速入门Python2.7

    以一段代码为实例快速入门Python2.7

    这篇文章主要以一段代码为实例、简单介绍了Python2.7的各种函数和方法以及语句,来自网络上火爆的在线Python教程网站learnxinyminutes.com,需要的朋友可以参考下
    2015-03-03
  • Python通过链接下载保存视频的几种实现方法

    Python通过链接下载保存视频的几种实现方法

    Python下载MP4视频可使用requests、pytube、youtube-dl及Selenium,需注意合法性、稳定性、格式兼容和代理设置,推荐pytube或youtube-dl处理主流平台,私有视频需先获取真实URL,本文通过代码示例介绍的非常详细,需要的朋友可以参考下
    2025-10-10
  • 基于Python实现web网页内容爬取的方法

    基于Python实现web网页内容爬取的方法

    在日常学习和工作中,我们经常会遇到需要爬取网页内容的需求,今天就如何基于Python实现web网页内容爬取进行讲解,感兴趣的朋友一起看看吧
    2024-12-12
  • Python中sorted()函数的强大排序技术实例探索

    Python中sorted()函数的强大排序技术实例探索

    排序在编程中是一个基本且重要的操作,而Python的sorted()函数则为我们提供了强大的排序能力,在本篇文章中,我们将深入研究不同排序算法、sorted() 函数的灵活性,以及各种排序场景下的最佳实践
    2024-01-01
  • 用Python实现一个简单的多线程TCP服务器的教程

    用Python实现一个简单的多线程TCP服务器的教程

    这篇文章主要介绍了用Python实现一个简单的多线程TCP服务器的教程,示例的运行环境为Windows操作系统,需要的朋友可以参考下
    2015-05-05
  • Python使用psutil获取进程信息的例子

    Python使用psutil获取进程信息的例子

    今天小编就为大家分享一篇Python使用psutil获取进程信息的例子,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2019-12-12

最新评论