实际开发过程当中可能要对某些方法或者流程做出改进,添加监控,添加日志记录等
所以我们要去改动已有的代码,自己的或者别人的,但改动后测试不周会引发不可控的异常,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装饰模式的更多相关文章

  1. Python:Python学习总结

    Python:Python学习总结 背景 PHP的$和->让人输入的手疼(PHP确实非常简洁和强大,适合WEB编程),Ruby的#.@.@@也好不到哪里(OO人员最该学习的一门语言). Pyth ...

  2. Python学习--04条件控制与循环结构

    Python学习--04条件控制与循环结构 条件控制 在Python程序中,用if语句实现条件控制. 语法格式: if <条件判断1>: <执行1> elif <条件判断 ...

  3. Python学习--01入门

    Python学习--01入门 Python是一种解释型.面向对象.动态数据类型的高级程序设计语言.和PHP一样,它是后端开发语言. 如果有C语言.PHP语言.JAVA语言等其中一种语言的基础,学习Py ...

  4. Python 学习小结

    python 学习小结 python 简明教程 1.python 文件 #!/etc/bin/python #coding=utf-8 2.main()函数 if __name__ == '__mai ...

  5. Python学习路径及练手项目合集

    Python学习路径及练手项目合集 https://zhuanlan.zhihu.com/p/23561159

  6. python学习笔记-python程序运行

    小白初学python,写下自己的一些想法.大神请忽略. 安装python编辑器,并配置环境(见http://www.cnblogs.com/lynn-li/p/5885001.html中 python ...

  7. Python学习记录day6

    title: Python学习记录day6 tags: python author: Chinge Yang date: 2016-12-03 --- Python学习记录day6 @(学习)[pyt ...

  8. Python学习记录day5

    title: Python学习记录day5 tags: python author: Chinge Yang date: 2016-11-26 --- 1.多层装饰器 多层装饰器的原理是,装饰器装饰函 ...

  9. [Python] 学习资料汇总

    Python是一种面向对象的解释性的计算机程序设计语言,也是一种功能强大且完善的通用型语言,已经有十多年的发展历史,成熟且稳定.Python 具有脚本语言中最丰富和强大的类库,足以支持绝大多数日常应用 ...

随机推荐

  1. nodejs入门-静态文件服务器

    本文展示是基于node.js的静态文件服务器,代码参考自这里,主要是练习node http.文件模块的使用,另外,对理解http协议也很有帮助除了实现了基本的路由控制,还实现了MIME类型.304缓存 ...

  2. EasyUI:年份、月份下拉框Demo

    EasyUI:年份.月份下拉框Demo jsp中定义: <td width="10%" height="25px" style="text-al ...

  3. 20145201 《Java程序设计》第三周学习总结

    20145201 <Java程序设计>第三周学习总结 教材学习内容总结 本周学习了课本第四.五章内容,即认识对象和对象封装. 第四章 认识对象 4.1类与对象 定义类 要产生对象必须先定义 ...

  4. 平滑重启php

    kill -USR2 `cat /usr/local/webserver/php/var/run/php-fpm.pid`

  5. Multiply Strings,字符串相乘

    问题描述:给定两个字符串,返回他们的乘积. public class MultiplyStrings { public String multiply(String num1, String num2 ...

  6. JNIjw02

    1.VC6(CPP)的DLL代码: #include<stdio.h> #include "jniZ_JNIjw02.h" JNIEXPORT void JNICALL ...

  7. Spring scope解惑

    在2.0之前只有两种singleton和prototype(网上说的,没去验证),后面增加了session.request.global session三种专门用于web应用程序上下文的Bean Si ...

  8. js 格式化时间日期函数小结2

    方法一: // 对Date的扩展,将 Date 转化为指定格式的String // 月(M).日(d).小时(h).分(m).秒(s).季度(q) 可以用 1-2 个占位符,  // 年(y)可以用  ...

  9. 关于jQuery中的offset()和position()

    在jQuery中有两个获取元素位置的方法offset()和position().position()方法是在1.2.6版本之后加入的,为什么要引 入这个方法呢?这两个方法之间有什么异同?使用的时候应该 ...

  10. 【LABVIEW到C#】4》String的操作之Search and Replace.vi

    C#封装如下: public class SearchAndRepalce : Darrenstring { public bool replaced; private string stringou ...