pin_drop当前位置:知识文库 ❯ 图文

Python装饰器 - 函数功能扩展技巧


概述

装饰器是Python中一种强大的语法,用于在不修改函数代码的情况下扩展函数的功能。装饰器本质上是一个函数,它接收一个函数作为参数,返回一个新函数。使用@语法糖可以简洁地应用装饰器。

语法

代码示例

@decorator
def func():
    pass

手动应用装饰器

代码示例

def my_decorator(func):
    def wrapper():
        print("函数调用前")
        result = func()
        print("函数调用后")
        return result
    return wrapper

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

say_hello = my_decorator(say_hello)
say_hello()

使用@语法糖

代码示例

def my_decorator(func):
    def wrapper():
        print("函数调用前")
        result = func()
        print("函数调用后")
        return result
    return wrapper

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

say_hello()

装饰带参数的函数

代码示例

def timer(func):
    import time
    def wrapper(*args, **kwargs):
        start = time.time()
        result = func(*args, **kwargs)
        end = time.time()
        print(f"{func.__name__} 耗时: {end-start:.4f}秒")
        return result
    return wrapper

@timer
def slow_function():
    import time
    time.sleep(1)
    print("函数执行完毕")

slow_function()

注意事项

提示:装饰器是接收函数、返回函数的函数。@语法糖等价于手动应用装饰器。装饰器可以在不修改原函数的情况下扩展功能。wrapper函数应使用*args, **kwargs接收任意参数。

小结

  • 装饰器本质:装饰器是接收函数、返回函数的函数

  • @语法糖:@语法糖等价于手动应用装饰器

  • 功能扩展:装饰器可以在不修改原函数的情况下扩展功能

  • 参数传递:wrapper函数应使用*args, **kwargs接收任意参数

小贴士

装饰器是Python中最强大的特性之一,广泛应用于日志记录、性能测试、权限验证、缓存等场景。学习装饰器需要理解闭包和高阶函数的概念。掌握装饰器可以写出更优雅、更可维护的代码。

练习题

练习1

编写装饰器log_calls记录函数调用

练习2

编写装饰器check_positive确保参数为正数

常见问题

装饰器的本质是什么?

装饰器本质上是一个函数,它接收一个函数作为参数,返回一个新的函数。装饰器允许你在不修改原函数代码的情况下,为其添加额外的功能。

@语法糖的作用是什么?

@语法糖是一种简洁的装饰器应用方式,它等价于手动将函数作为参数传递给装饰器并重新赋值。例如`@decorator`等价于`func = decorator(func)`。

为什么wrapper函数要使用*args和**kwargs?

使用*args和**kwargs可以让装饰器适配任何参数形式的函数,包括位置参数、关键字参数和默认参数。这使得装饰器具有通用性,可以应用于各种函数。

装饰器有哪些常见应用场景?

装饰器常用于日志记录、性能测试(计时)、权限验证、缓存、重试机制、输入验证等场景。它们可以在不修改业务逻辑代码的情况下,为函数添加横切关注点。

标签: 装饰器 @语法糖 高阶函数 函数包装 Python基础 闭包

本文涉及AI创作

内容由AI创作,请仔细甄别

list快速访问

上一篇: Python闭包 下一篇: Python装饰器进阶 - 带参数装饰器与类装饰器

poll相关推荐