python学习之aop装饰模式
实际开发过程当中可能要对某些方法或者流程做出改进,添加监控,添加日志记录等
所以我们要去改动已有的代码,自己的或者别人的,但改动后测试不周会引发不可控的异常,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();
python学习之aop装饰模式的更多相关文章
- Python:Python学习总结
Python:Python学习总结 背景 PHP的$和->让人输入的手疼(PHP确实非常简洁和强大,适合WEB编程),Ruby的#.@.@@也好不到哪里(OO人员最该学习的一门语言). Pyth ...
- Python学习--04条件控制与循环结构
Python学习--04条件控制与循环结构 条件控制 在Python程序中,用if语句实现条件控制. 语法格式: if <条件判断1>: <执行1> elif <条件判断 ...
- Python学习--01入门
Python学习--01入门 Python是一种解释型.面向对象.动态数据类型的高级程序设计语言.和PHP一样,它是后端开发语言. 如果有C语言.PHP语言.JAVA语言等其中一种语言的基础,学习Py ...
- Python 学习小结
python 学习小结 python 简明教程 1.python 文件 #!/etc/bin/python #coding=utf-8 2.main()函数 if __name__ == '__mai ...
- Python学习路径及练手项目合集
Python学习路径及练手项目合集 https://zhuanlan.zhihu.com/p/23561159
- python学习笔记-python程序运行
小白初学python,写下自己的一些想法.大神请忽略. 安装python编辑器,并配置环境(见http://www.cnblogs.com/lynn-li/p/5885001.html中 python ...
- Python学习记录day6
title: Python学习记录day6 tags: python author: Chinge Yang date: 2016-12-03 --- Python学习记录day6 @(学习)[pyt ...
- Python学习记录day5
title: Python学习记录day5 tags: python author: Chinge Yang date: 2016-11-26 --- 1.多层装饰器 多层装饰器的原理是,装饰器装饰函 ...
- [Python] 学习资料汇总
Python是一种面向对象的解释性的计算机程序设计语言,也是一种功能强大且完善的通用型语言,已经有十多年的发展历史,成熟且稳定.Python 具有脚本语言中最丰富和强大的类库,足以支持绝大多数日常应用 ...
随机推荐
- 【Flask】Flask上下文
# 上下文: ### Local对象:在`Flask`中,类似于`request`的对象,其实是绑定到了一个`werkzeug.local.Local`对象上.这样,即使是同一个对象,那么在多个线程中 ...
- jQuery垂直滑动切换焦点图
在线演示 本地下载
- VRChat简易教程4-使用VRC的接口实现物体的移动(VRC的action和trigger接口)
这个教程我们学习如何实现载具的驾驶 一.准备工作 1 最简单的载具驾驶需要至少两个元素,一是需要一个载具,二是需要一个前进的按钮(这里我们只做前进功能),为了直观的能感受到载具的移动,我们还得创造一个 ...
- 实验一 Linux初步认识
遇到的困难和心得体会: 1.在操作过程中,有道作业是建立一个opt/forloutest的文件,而我建立了一个 OPT文件,cd OPT,却显示not a directory,通过阅读<linu ...
- 实验四Android开发
实验四Java Android简易开发 实验准备 Android Studio 的下载: Android Studio 安装教程 在安装过程中的问题: 在下载了官网上的说明包含sdk的安装包之后找不到 ...
- 简单介绍java Enumeration(转)
Enumeration接口 Enumeration接口本身不是一个数据结构.但是,对其他数据结构非常重要. Enumeration接口定义了从一个数据结构得到连续数据的手段.例如,Enumeratio ...
- WIN10 安装Docker MySQL Ubuntu
1) 必须专业版, 要开启 Hyper-V 2)下载安装包: 链接:https://pan.baidu.com/s/1APqcq2glvwzsCHlwRnPXkA 密码:wpej 3)安装时不要勾 ...
- ngnix进阶
ngnix进阶 nginx: [warn] duplicate MIME type "text/html" in /usr/local/nginx/conf/nginx.conf: ...
- 初入spring boot(四 )web项目
1. 模板引擎 spring boot提供了大量的模板引擎,包括FreeMark.Groovy.Thymeleaf.Velocity等,但spring boot中推荐用Thymeleaf,因为Thym ...
- EYES组——软件体系结构上机规划
EYES组——软件体系结构上机规划 考勤助手 第九周: 需求分析的详细撰写,并在此基础上探讨与完善,讨论软件的体系结构风格,画出初步的UML类图. 第十周: 选择合适的软件构架风格(3层C/S架构风格 ...