python中装饰器decorator的用法及案例
1.装饰器介绍
装饰器(Decorator)是 Python 中一种用于修改函数或类的行为的高级技术。装饰器本质上是一个函数,它接受一个函数作为输入,并返回一个新的函数作为输出。通过使用装饰器,可以在不修改原始函数代码的情况下,添加额外的功能或修改函数的行为
。
装饰器的用法如下:
- 定义装饰器函数:创建一个装饰器函数,它接受一个函数作为参数,并返回一个新的函数。
- 使用装饰器修饰函数:在要修饰的函数前面加上 @装饰器函数名 的语法糖。
- 调用修饰后的函数:通过调用修饰后的函数来执行原始函数,并获得装饰器添加的额外功能或修改的行为。
1.1用函数的形式创建装饰器
下面是一个示例,展示了装饰器的用法:
def my_decorator(func):
def wrapper(*args, **kwargs):
print(f"调用函数:{func.__name__}")
result = func(*args, **kwargs)
print(f"函数调用结束:{func.__name__}")
return result
return wrapper
# 使用装饰器修饰函数
@my_decorator
def add_numbers(a, b):
return a+b
print(add_numbers(5, 6))
调用函数:add_numbers
函数调用结束:add_numbers
11
1.2用类的形式创建装饰器
# 使用类作为装饰器
class my_decorator_class:
def __init__(self, func):
self.func = func
def __call__(self, *args: Any, **kwds: Any) -> Any:
print(f'{self.func.__name__}被执行')
ret = self.func(*args, **kwds)
print(f'{self.func.__name__}执行完毕')
return ret
# 使用装饰器修饰函数
@my_decorator_class
def add_numbers(a, b):
return a+b
print(add_numbers(5, 6))
add_numbers被执行
add_numbers执行完毕
11
这种方式使用类实现装饰器时,装饰器类的实例可以像函数一样被调用,因为它实现了 call() 方法。这使得装饰器类的用法与函数装饰器非常类似。
2.装饰器的应用
当谈到装饰器的应用时,以下是一些常见的示例:
2.1日志记录
class LOG_Decorator:
def __init__(self, func) -> None:
self.func = func
def __call__(self, *args: Any, **kwds: Any) -> Any:
print(f'{self.func.__name__}函数正在被执行...')
ret = self.func(*args, **kwds)
print(f'{self.func.__name__}函数执行完毕!')
return ret
@LOG_Decorator
def log_test(a, b):
return a+b
print(log_test(5, 6))
log_test函数正在被执行...
log_test函数执行完毕!
11
在上述示例中,LOG_Decorator
装饰器用于添加日志记录功能。每次调用log_test
函数时,都会在控制台打印函数的调用信息和结束信息。
2.2程序计时器
class TIME_Decorator:
def __init__(self, func) -> None:
self.func = func
def __call__(self, *args: Any, **kwds: Any) -> Any:
begin_time = time.time()
ret = self.func(*args, **kwds)
end_time = time.time()
print(f'{self.func.__name__}函数执行的时间为:{(end_time-begin_time)*1000}ms')
return ret
@TIME_Decorator
def time_test(count, a, b):
total = 0
for i in range(count):
total += a*b
return total
print(time_test(1000000, 5, 600))
print(time_test(2000000, 50, 60))
time_test函数执行的时间为:65.7963752746582ms
3000000000
time_test函数执行的时间为:132.7962875366211ms
6000000000
在上述示例中,TIME_Decorator 装饰器用于计算函数执行的时间。每次调用 time_test 函数时,都会在控制台打印函数的执行时间。
2.3缓存
class CACHE_Decorator:
def __init__(self, func) -> None:
self.func = func
self.cache = {}
def __call__(self, *args: Any, **kwds: Any) -> Any:
if args in self.cache:
return self.cache[args]
else:
ret = self.func(*args, **kwds)
self.cache[args] = ret
return ret
@CACHE_Decorator
def fibonacci(n):
if n <= 1:
return n
else:
return fibonacci(n-1) + fibonacci(n-2)
result = fibonacci(10)
print(f"结果:{result}")
在上述示例中,CACHE_Decorator 装饰器用于添加缓存功能,以提高斐波那契数列计算的效率。每次调用 fibonacci 函数时,都会检查是否已经计算过相同的参数,并从缓存中获取结果。如果没有缓存,则计算并将结果存储在缓存中,以供后续使用。
这些是装饰器的一些常见应用示例,通过装饰器可以轻松地为函数添加额外的功能或修改行为,提高代码的可读性和可维护性。装饰器的应用场景非常广泛,可以根据具体需求进行自定义。