9-5在类中定义装饰器
来源:互联网 发布:在iphone编程 编辑:程序博客网 时间:2024/06/14 05:22
# -*- coding:utf-8 -*-"""实际案例:实现一个能将函数调用信息记录到日志的装饰器:1.把每次函数的调用时间,执行时间.调用次数写入日志.2.可以对被装饰函数分组,调用信息记录到不同日志.3.动态修改参数,比如日志格式.4.动态打开关闭日志输出功能解决方案:为了让装饰器在使用上更加灵活,可以把类的实例方法作为装饰器,此时在包裹函数中就可以持有实例对象,便于修改属性和拓展功能"""import loggingfrom time import localtime, time, strftime, sleepfrom random import choiceclass CallingInfo(object): def __init__(self, name): # name决定日志输出到那个文件当中 log = logging.getLogger(name) log.setLevel(logging.INFO) # 输出级别 fh = logging.FileHandler(name + '.log') log.addHandler(fh) log.info('Start'.center(50, '-')) # - 占位:-----------Start----------- 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.formatter得到输出信息 self.log.info(msg) return res wrapper.ncalls = 0 # 将调用次数作为函数的属性,比较方便调用 return wrapper def setFormatter(self, formatter): self.formatter = formatter def turnOn(self): """降低级别""" self.log.setLevel(logging.INFO) def turnOff(self): """抬高级别""" self.log.setLevel(logging.WARN)cinfo1 = CallingInfo('mylog1')cinfo2 = CallingInfo('mylog2')cinfo1.setFormatter('%(func)s -> [%(time)s - %(ncalls)s]')cinfo2.turnOff()@cinfo1.infodef f(): print('in f')@cinfo1.infodef g(): print('in g')@cinfo2.infodef h(): print('in h')for _ in range(50): choice([f, g, h])() # choice 的使用 sleep(choice([0.5, 1, 1.5]))
0 0
- 9-5在类中定义装饰器
- Python在类中定义Decorator装饰器
- python 9-5 如何在类中定义装饰器,在包裹函数中就可以持有实例对象,便于修改属性和功能
- python中装饰器的使用和类装饰器在类中方法的使用
- 在struts2中加入装饰器sitemesh
- python装饰器的4中类型:函数装饰函数、函数装饰类、类装饰函数、类装饰类
- 在类中定义常量
- 在Javascript中定义类
- 9-3定义带参数的装饰器
- sitemesh定义多个装饰器
- sitemesh定义多个装饰器
- Decorator装饰器定义可选参数
- python装饰器装饰类
- Python中装饰器
- python 中装饰器
- 在JAVA中定义类的结构
- 在VC++中定义全局变量及类
- 如何在类中定义常量?
- 加载资源之路径问题
- MYSQL基础(DML)
- 网上找到的最简单说明建立IDoc的文章
- VPN
- Android软键盘的弹出和隐藏
- 9-5在类中定义装饰器
- 简述单例设计模式的一些理解及代码实现
- dataTables的属性及用法
- Java中hashcode方法与equals方法关联关系的直观解释
- 设计模式--23种模式精华(二)
- Lua学习笔记(2):基本语法
- MongoDB安装Windows服务
- ThinkPHP(4)--输出和模型使用2
- HA+Federation集群实现(七)