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

Written by

in

文章目录
  • 装饰器 = 一个函数,它接收另一个函数作为参数,并返回一个新的函数(通常通过闭包实现)本质是高阶函数 + 闭包,用于在不修改原函数代码的前提下,增强函数功能 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闭包装饰器综合案例解析 Python之@cache装饰器的使用及说明 Python @dataclass装饰器举例详解 深度解析Python装饰器常见用法与进阶技巧 Python装饰器之类装饰器详解 Python 中的装饰器实现函数的缓存(场景分析) Python装饰器实现函数运行时间的计算 python装饰器相当于函数的调用方式 python函数装饰器之带参数的函数和带参数的装饰器用法示例
  • 目录
    • 是什么
    • 能干嘛
    • 函数装饰器完整工作流程

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

    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闭包装饰器综合案例解析
    • Python之@cache装饰器的使用及说明
    • Python @dataclass装饰器举例详解
    • 深度解析Python装饰器常见用法与进阶技巧
    • Python装饰器之类装饰器详解
    • Python 中的装饰器实现函数的缓存(场景分析)
    • Python装饰器实现函数运行时间的计算
    • python装饰器相当于函数的调用方式
    • python函数装饰器之带参数的函数和带参数的装饰器用法示例

    站内搜索