1. 不带参的装饰器
以下实现打印函数的执行时间为例, 分别用函数装饰器和类装饰器实现
函数装饰器
import time
from functools import wraps
def func_time(func):
@wraps(func)
def wrapper(*args, **kwargs):
start = time.time()
res = func(*args, **kwargs)
print(time.time() - start)
return res
return wrapper
测试例子:
@func_time
def test_func():
time.sleep(1)
> test_func()
类装饰器
import time
from functools import wraps
class FuncTime:
def __init__(self):
"""class decorator"""
def __call__(self, func):
@wraps(func)
def wrapper(*args, **kwargs):
start = time.time()
res = func(*args, **kwargs)
print(time.time() - start)
return res
return wrapper
测试例子:
@FuncTime()
def test_func():
time.sleep(1)
> test_func()
2. 带参的装饰器
实现一个重试功能的装饰器
函数装饰器
import time
from functools import wraps
def retry(n: int):
def decorator(func):
@wraps(func)
def wrapper(*args, **kwargs):
count = 0
while count < n:
count += 1
try:
return func(*args, **kwargs)
except Exception as e:
print(e)
return wrapper
return decorator
类装饰器
from functools import wraps
class Retry:
"""retry many times"""
def __init__(self, n):
self._n = n
def __call__(self, func):
@wraps(func)
def wrapper(*args, **kwargs):
count = 0
while count < self._n:
count += 1
try:
return func(*args, **kwargs)
except Exception as e:
print(e)
return wrapper
暂时不做示例测试, 有看到错误或者更好的方法的小伙伴, 欢迎交流指正