在Python函数中使用装饰器-实用装饰器与函数修饰。
在Python中,装饰器是一种特殊的函数,它可以用于修改其他函数的功能。装饰器在Python中的应用十分广泛,可以用于日志记录、缓存、身份验证等各种场景。
使用装饰器可以将一个函数作为参数传递给另一个函数,并返回一个新的函数,新函数可以在调用原函数前后执行一些额外的操作。这样可以在不修改原函数代码的情况下,给函数添加新的功能。
下面是一个简单的例子,展示了如何使用装饰器修改函数的功能:
def decorator(func):
def wrapper():
print("装饰器开始执行")
func()
print("装饰器执行完毕")
return wrapper
@decorator
def hello():
print("Hello, Python!")
hello()
在上面的代码中,我们定义了一个装饰器函数decorator,它接受一个函数作为参数,并返回一个新的函数wrapper。然后我们使用@decorator语法将hello函数修饰成一个新的函数。
运行上面的代码,输出结果为:
装饰器开始执行 Hello, Python! 装饰器执行完毕
从输出结果可以看出,装饰器在调用hello函数前后分别输出了装饰器开始执行和装饰器执行完毕的信息。
除了上面的示例外,实际使用中装饰器还有很多实用的应用场景。下面我们将介绍一些常用的实用装饰器和函数修饰技巧。
1. 记录日志
import logging
def log_decorator(func):
def wrapper(*args, **kwargs):
logging.info(f"函数 {func.__name__} 被调用")
return func(*args, **kwargs)
return wrapper
@log_decorator
def add(a, b):
return a + b
result = add(1, 2)
上面的代码使用装饰器log_decorator实现了一个日志记录功能。每次调用被装饰的函数时,都会在日志中记录函数被调用的信息。
2. 缓存结果
def cache_decorator(func):
cache = {}
def wrapper(*args):
if args in cache:
return cache[args]
else:
result = func(*args)
cache[args] = result
return result
return wrapper
@cache_decorator
def fib(n):
if n < 2:
return n
return fib(n-1) + fib(n-2)
result = fib(10)
上面的代码使用装饰器cache_decorator实现了一个缓存结果的功能,对于斐波那契数列的计算,如果之前已经计算过某个数的结果,则直接返回缓存中的结果,避免重复计算。
3. 身份验证
def auth_decorator(func):
def wrapper(*args):
if check_auth():
return func(*args)
else:
raise Exception("身份验证失败")
return wrapper
@auth_decorator
def create_order(user_id):
# 创建订单逻辑
pass
create_order(123)
上面的代码使用装饰器auth_decorator实现了一个身份验证功能,每次调用create_order函数时,都会先验证用户的身份,如果验证通过则继续执行函数,否则抛出异常。
除了上面提到的实用装饰器之外,还有很多其他的装饰器可以用于修改函数的功能,例如:
- 计时器:用于统计函数的执行时间。
- 重试:当函数执行失败时,自动重试指定次数。
- 参数校验:在函数调用前检查参数的合法性。
- 权限验证:检查用户是否有执行函数的权限。
总之,装饰器是Python中非常有用的一种语法特性,可以用于扩展函数的功能。通过使用装饰器,可以在不修改函数代码的情况下,给函数添加日志记录、缓存、身份验证等各种功能。这使得代码更加简洁、可复用,提高了代码的可维护性和可拓展性。
