当前位置:首页 > Python > 正文

深入掌握Python装饰器(高级应用与实战技巧)

在Python开发中,Python装饰器高级应用是提升代码可读性、复用性和模块化的重要手段。本教程将从基础概念出发,逐步引导你掌握装饰器的高级用法,即使你是编程小白也能轻松理解。

什么是装饰器?

装饰器本质上是一个接受函数作为参数并返回新函数的高阶函数。它允许我们在不修改原函数代码的前提下,为函数添加额外功能,比如日志记录、性能测试、权限校验等。

深入掌握Python装饰器(高级应用与实战技巧) Python装饰器高级应用 Python装饰器实战 函数装饰器技巧 Python元编程装饰器 第1张

基础装饰器回顾

先来看一个简单的装饰器示例:

def my_decorator(func):    def wrapper():        print("函数执行前...")        func()        print("函数执行后...")    return wrapper@my_decoratordef say_hello():    print("Hello!")say_hello()

运行结果会先打印“函数执行前...”,再输出“Hello!”,最后打印“函数执行后...”。这是装饰器最基础的用法。

带参数的装饰器

实际开发中,我们经常需要向装饰器传递参数。这时就需要三层嵌套函数:

def repeat(times):    def decorator(func):        def wrapper(*args, **kwargs):            for _ in range(times):                result = func(*args, **kwargs)            return result        return wrapper    return decorator@repeat(3)def greet(name):    print(f"Hello, {name}!")greet("Alice")

这里 repeat 是一个接收参数 times 的装饰器工厂函数,它返回真正的装饰器 decorator。这种模式在 Python装饰器实战 中非常常见。

保留原函数元信息

使用装饰器后,原函数的 __name____doc__ 等属性会被覆盖。为了解决这个问题,可以使用 functools.wraps

from functools import wrapsdef log_calls(func):    @wraps(func)    def wrapper(*args, **kwargs):        print(f"调用函数: {func.__name__}")        return func(*args, **kwargs)    return wrapper@log_callsdef add(a, b):    """计算两个数的和"""    return a + bprint(add.__name__)  # 输出: addprint(add.__doc__)   # 输出: 计算两个数的和

类装饰器

除了函数形式,装饰器也可以用类来实现。只要类实现了 __call__ 方法即可:

class CountCalls:    def __init__(self, func):        self.func = func        self.count = 0    def __call__(self, *args, **kwargs):        self.count += 1        print(f"{self.func.__name__} 被调用了 {self.count} 次")        return self.func(*args, **kwargs)@CountCallsdef say_hi():    print("Hi!")say_hi()  # say_hi 被调用了 1 次say_hi()  # say_hi 被调用了 2 次

装饰器叠加与执行顺序

Python允许对一个函数应用多个装饰器,它们的执行顺序是从下到上(即最靠近函数的先执行):

@decorator1@decorator2@decorator3def my_function():    pass# 等价于:# my_function = decorator1(decorator2(decorator3(my_function)))

实战:缓存装饰器(记忆化)

下面是一个经典的斐波那契数列缓存优化示例,展示了 函数装饰器技巧 的强大之处:

from functools import lru_cache@lru_cache(maxsize=128)def fibonacci(n):    if n < 2:        return n    return fibonacci(n-1) + fibonacci(n-2)print(fibonacci(100))  # 极快!因为结果被缓存了

你也可以自己实现一个简单的缓存装饰器,加深对 Python元编程装饰器 的理解。

总结

通过本教程,你已经掌握了从基础到高级的Python装饰器用法,包括带参装饰器、类装饰器、元信息保留、装饰器叠加以及实战缓存应用。熟练运用这些 Python装饰器高级应用 技巧,能让你写出更优雅、更高效的Python代码。

提示:多动手实践是掌握装饰器的关键。尝试为你的项目添加日志、计时或权限控制装饰器吧!