实际开发过程当中可能要对某些方法或者流程做出改进,添加监控,添加日志记录等
所以我们要去改动已有的代码,自己的或者别人的,但改动后测试不周会引发不可控的异常,aop 模式解决了这类问题
引发重复代码大量积累,装饰器解决了些类问题

1:基础篇

import functools

#采用functools.wraps的目的是为了使装饰器返回的类型始终是func的类型,否则将返回嵌套高阶函数的中的类型,例如返回的是wraper
#采用参数*args ,**kw是解决函数多参数的问题
def log(func):
@functools.wraps(func)
def wrapper(*args, **kw):
print 'call %s():' % func.__name__
return func(*args, **kw)
return wrapper #修饰器参数的情况
def logger(pram):
def log(func):
@functools.wraps(func)
def wrapper(*args, **kw):
print 'call %s(): and parsms is %s' %(func.__name__,pram);
return func(*args, **kw);
return wrapper;
return log; @log
def showMesage(name,age):
print("my name is {0} and my age is {1}".format(name,age)); @logger("hello")
def getMessage(name,age):
print("my name is {0} and my age is {1}".format(name,age)); #添加多个修饰器来拓展所需的功能
@log
@logger("hello15466")
def recieveMessage(name,age):
print("my name is {0} and my age is {1}".format(name,age)); if __name__=='__main__':
showMesage("ddd",21);
getMessage("aaa",43);
recieveMessage("ccc",34);

2:通过一个实用性的示例来继续描述下装饰器的使用场景,这次我将装饰器提取到类中,需要调用的地方通过类的引用来调取

下面这个示例演示的是一个监控程序运行时间的,如下:

一: 建立一个监控类[monitor.py]:

import functools;
import time; class monitor:
@staticmethod
def startmonitor():
return time.clock(); @staticmethod
def endmonitor():
return time.clock(); def listener(listen):
def log(func):
@functools.wraps(func)
def wrapper(*args, **kw):
startime=listen.startmonitor();
f=func(*args, **kw);
endtime=listen.endmonitor();
print("total time is {0}".format(startime-endtime));
return f;
return wrapper;
return log;

二:在需要使用的地方来调用监控

from  monitor import  *;

@listener(monitor)
def getinfo():
print("hello ,welcome!"); if __name__=="__main__":
getinfo();

最新文章

  1. clr 元数据
  2. 自制文件上传JS控件,支持IE、chrome、firefox etc.
  3. libevent之丢失header问题
  4. matplotlib 和 pandas 两个包的安装
  5. PhpStorm中字体大小的改变方法
  6. 安装完最小化 RHEL/CentOS 7 后需要做的 30 件事情(四)码农网
  7. poj 2031 Building a Space Station(最小生成树,三维,基础)
  8. Untiy 接入 移动MM 详解
  9. bzoj1965
  10. poj 3463 Sightseeing(次短路+条数统计)
  11. Afianl加载网络图片(延续)
  12. 2016WHD.china世界云计算日·北京站即将召开
  13. [2013-07-22]varnish-cache 安装配置及体验笔记
  14. React UI 组件库uiw v1.2.8 发布
  15. 在没有DOM操作的日子里,我是怎么熬过来的(上)
  16. ES6 学习笔记之二 块作用域与闭包
  17. 大白话5分钟带你走进人工智能-第三节最大似然推导mse损失函数(深度解析最小二乘来源)(1)
  18. Python基础(数字,字符串方法)
  19. Charles抓https请求详细步骤
  20. 翻译wiki(一):Bios boot partition

热门文章

  1. 设计模式(六) xml方式实现AOP
  2. ES6 随记(3.2)-- 正则的拓展 & 数值的拓展
  3. MySQL引擎及选择
  4. Java:判断字符串中包含某字符的个数
  5. securecrt重建
  6. MapReduce:输入是两个文件,file1代表工厂表,包含工厂名列和地址编号列;file2代表地址表,包含地址名列和地址编号列。要求从输入数据中找出工厂名和地址名的对应关系,输出"工厂名----地址名"表
  7. Linux系统下chkconfig命令使用详解
  8. Limit CPUID MAX
  9. Elasticsearch6.4.3文档的映射
  10. Multiple actions were found that match the request in Web Api