python 9-5 如何在类中定义装饰器,在包裹函数中就可以持有实例对象,便于修改属性和功能

来源:互联网 发布:it 域名 编辑:程序博客网 时间:2024/05/29 03:17

9-5 如何在类中定义装饰器
解决方案:
为了让装饰器在使用上更加灵活,可以把类的实例方法作为装饰器
此时在包裹函数中就可以持有实例对象,便于修改属性和功能

import loggingfrom time import  localtime,time,strftime,sleepclass CallingInfo(object):    def __init__(self,name):        log = logging.getLogger(name)        log.setLevel(logging.INFO)        fh = logging.FileHandler(name + '.log')        log.addHandler(fh)        log.info("start...".center(50,'-'))        self.log = log        self.formatter = '%(func)s ->[%(time)s - %(used)s - %(ncalls)s -]'    def info(self,func):        def wrapper(*args,**kwargs):            wrapper.ncalls += 1            lt = localtime()            start = time()            res = func(*args,**kwargs)            used = time() - start            info = {}            info['func'] = func.__name__            info['time'] = strftime('%x %X',lt)            info['used'] = used            info['ncalls'] = wrapper.ncalls            msg = self.formatter % info            self.log.info(msg)            return res        wrapper.ncalls = 0        return wrapper    def setFormater(self,formatter):        self.formatter = formatter    def turnOn(self):        log.setLevel(logging.INFO)    def turnOff(self):        self.log.setLevel(logging.WARN)cinfo1 = CallingInfo('mylog1')cinfo2 = CallingInfo('myLog2')cinfo1.setFormater('%(func)s ->[%(time)s - %(used)s - %(ncalls)s -]')cinfo2.turnOff()@cinfo1.infodef f():    print "in f"@cinfo1.infodef g():    print 'in g'@cinfo2.infodef h():    print 'in h'from random import choicefor _ in xrange(50):    choice([f,g,h])()    sleep(choice([0.5,1,1.5]))
0 0
原创粉丝点击