📅  最后修改于: 2023-12-03 15:28:10.778000             🧑  作者: Mango
Python中装饰器是一种在运行时动态增加函数功能的方式,通过定义一个函数来装饰其他函数,使得被装饰函数能够在不改变原有代码的情况下增加新的功能。本文将介绍Python中装饰器的几种有用案例。
计时器装饰器可以用来计算函数的运行时间,该装饰器可以应用于任意函数。
import time
def timer(func):
def wrapper(*args, **kwargs):
start_time = time.time()
result = func(*args, **kwargs)
end_time = time.time()
print('{} function took {:.2f} s'.format(func.__name__, end_time - start_time))
return result
return wrapper
@timer
def my_function():
# 模拟函数执行
time.sleep(2)
my_function() # my_function function took 2.00 s
缓存装饰器可以用来缓存函数的计算结果,如果下次调用该函数时参数相同,直接返回缓存的结果,避免重复计算。
def cache(func):
memo = {}
def wrapper(*args):
if args not in memo:
memo[args] = func(*args)
return memo[args]
return wrapper
@cache
def fibonacci(n):
if n in (0, 1):
return n
return fibonacci(n-1) + fibonacci(n-2)
print(fibonacci(10)) # 55
日志装饰器可以用来记录函数的输入和输出,方便调试和分析。
def logger(func):
def wrapper(*args, **kwargs):
args_str = ', '.join(map(str, args))
kwargs_str = ', '.join('{}={}'.format(k, v) for k, v in kwargs.items())
signature = '{}({}{})'.format(func.__name__, args_str, kwargs_str)
result = func(*args, **kwargs)
print('{} -> {}'.format(signature, result))
return result
return wrapper
@logger
def my_function(x, y):
return x * y
my_function(2, 3) # my_function(2, 3) -> 6
如果需要同时应用多个装饰器,可以使用链式装饰器,即将多个装饰器串联起来,形成一个新的装饰器。
def decorator1(func):
def wrapper(*args, **kwargs):
print('decorator1: before')
result = func(*args, **kwargs)
print('decorator1: after')
return result
return wrapper
def decorator2(func):
def wrapper(*args, **kwargs):
print('decorator2: before')
result = func(*args, **kwargs)
print('decorator2: after')
return result
return wrapper
@decorator1
@decorator2
def my_function():
print('my_function')
my_function()
# decorator1: before
# decorator2: before
# my_function
# decorator2: after
# decorator1: after
以上是Python中装饰器的几个有用的例子,通过装饰器,可以将不同的功能注入到函数中,使程序更加灵活和可扩展。