在Python开发中,Python装饰器高级应用是提升代码可读性、复用性和模块化的重要手段。本教程将从基础概念出发,逐步引导你掌握装饰器的高级用法,即使你是编程小白也能轻松理解。
装饰器本质上是一个接受函数作为参数并返回新函数的高阶函数。它允许我们在不修改原函数代码的前提下,为函数添加额外功能,比如日志记录、性能测试、权限校验等。
先来看一个简单的装饰器示例:
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代码。
提示:多动手实践是掌握装饰器的关键。尝试为你的项目添加日志、计时或权限控制装饰器吧!
本文由主机测评网于2025-12-28发表在主机测评网_免费VPS_免费云服务器_免费独立服务器,如有疑问,请联系我们。
本文链接:https://vpshk.cn/20251213311.html