装饰器
待参数类实现的装饰器
'''
以类实现待参数的装饰器
1. wrap_logger() 立刻对应 __init__
2. obj(func) 立刻对应 __call__
3. func = callable(func), 第一对象callable,开始执行,
并且内部有定义了一个函数 wrapper,并返回(和定义了一个变量wrapper并返回没有区别)
@callable
def func():
pass
4. 区分不同部分含义
- 装饰器定义部分
- 加装饰器业务函数定义部分
- 业务函数执行部分
'''
import uuid
import functools
# 装饰器定义部分
class wrap_logger(object):
def __init__(self, logger, prefix, no_generator=None):
super(wrap_logger, self).__init__()
self.logger = logger
self.prefix = prefix
if not no_generator:
no_generator = uuid.uuid1
self.no_generator = no_generator
def __call__(self, func):
@functools.wraps(func)
def wrapper(*arg, **kw):
no = str(self.no_generator())
self.logger.warning(self.prefix + ' start %s' % no)
try:
return func(*arg, **kw)
except Exception as e:
raise e
finally:
self.logger.warning(self.prefix + ' end %s' % no)
return wrapper
import logging
import time
log = logging.getLogger(__name__)
# 加装饰器业务函数定义部分
@wrap_logger(log, 'func', no_generator=time.time)
def func(name):
time.sleep(3)
print('from func name: %s' % name)
# 业务函数执行部分
func('linda')
Last updated