装饰器

待参数类实现的装饰器

'''
以类实现待参数的装饰器

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