装饰器的作用,以及给装饰器添加参数
一.装饰器的作用
装饰器可用于修改或拓展函数或方法,通常用于在不修改原始函数代码的情况下,添加额外的功能、行为或逻辑。常见用途有:
1.代码复用:装饰器可以定义一些通用的功能,并将其应用于多个函数,从而实现代码的复用。
2.日志记录:用装饰器来记录函数的调用时间、参数和返回值,以便进行调试和性能分析。
3.权限检查:用于检查用户是否有足够的权限进行某个操作,从而进行访问控制。
4.性能优化:装饰器可用于缓存函数的结果,避免重复计算,提高程序性能。
5.异常处理:装饰器可用于捕获函数内部的异常,并进行相应处理。
6.参数验证:用于验证函数的输入参数是否符合预期,从而提高代码的鲁棒性。
7.缓存:装饰器可用于实现缓存机制,将函数的结果缓存起来,提高程序的运行效率。
示例:记录函数的执行时间
import time
def time_decorator(func):
def wrapper(*args, **kwargs):
start_time = time.time()
result = func(*args, **kwargs)
end_time = time.time()
print(f"function {func.__name__} took {end_time - start_time:.4f} seconds to execute.")
return result
return wrapper
@time_decorator
def example_func():
time.sleep(3)
#调用被装饰的函数
example_func()
在这里使用语法糖@time_decorator等价于:
def example_func()
time.sleep(2)
example_func = time_decorator(example_func)
example_func()
注意:多个装饰器可以同时用在一个函数上:
@add
@square
def func():
...
在这里先调用square,后调用add
二.如何给装饰器传递参数
1.装饰器工厂函数:创建一个装饰器工厂函数,该工厂函数接收参数并返回一个真正的装饰器函数
def decorator_factory(param):
def decorator(func):
def wrapper(*args, **kwargs):
print(f"Decorator with parameter {param} is applied to {func.__name__}")
result = func(*args,**kwargs)
return result
return wrapper
return decorator
@decorator_factory(param = "some_value")
def myfunc():
print("hello")
myfunc()
2.使用偏函数:使用functools.partial船舰一个偏函数,将函数传递给他,并将其应用于装饰器
from functools import partial
def decorator(param, func):
def wrapper(*args, **kwargs):
print("...")
result = func(*args, **kwargs)
return result
return wrapper
myfunc = partial(decorator, param = "some_value")(myfunc)
myfunc()
3.使用类作为装饰器:定义一个类作为装饰器,该类的“__init__”方法接收参数。”__call__“方法用于实现装饰逻辑。
class Mydecorator:
def __init__(self, param):
self.param = param
def __call__(self, func):
def wrapper(*args, **kwargs):
print("hello")
result(*args, **kwargs)
return result
return wrapper
@Mydecorator(param = "some_value")
def myfunc():
print("hello")
myfunc()