python(十一)面向切面编程AOP和装饰器
二、装饰器
装饰器可以在给函数修改功能的同时并不改变这个函数本身。(以下用的都是python2.7)
首先,在python里面函数是对象,在下面的函数里"fun"是函数也是对象可以传递给test。加括号才能执行函数[1]。
def fun():
print "run a test fun()" fun() #fun() 是执行函数
#输出 "run a test fun()" test = fun #fun 是函数,可以进行传递
test() #test() 也可以执行函数
#输出 "run a test fun()"
现在要给函数 fun() 修改增加一点功能, 但是又不改变fun() 这个函数本身,这时候可以用下面的 modify 函数对 fun() 进行调用,这
这样既不改变 fun() 本身,还能增加功能。
def fun():
print "run a test fun()" def modify(function): #这里的参数function可以用传递函数
print "modify"
function() #因此传递的参数可以在这里执行 modify(fun) #在这传递函数fun()
#输出
#modify
#run a test fun() test = modify
test(fun)
#输出
#modify
#run a test fun()
现在把上面的代码用简洁的方式实现相同的功能,只要把@加上函数名放在要修改的函数前面就有相同的功能,注意用来修饰的函数也就是下面的modify函数必须要有参数,而这个参数就是用来传递原来的函数用的。这个功能就是装饰器,等于减少了手动创建原函数的过程。
(下面会出现一点问题)
def modify(function):
print "modify"
function() @modify
def fun():
print "run a test fun()" fun() #但是这里执行不能用fun()了,得用fun
#输出
#抛出异常fun()TypeError: 'NoneType' object is not callable
fun
#输出
#modify
#run a test fun()
这里如果要用fun() 执行函数的话,得将modify 函数改变一下, 在modify 函数里的function返回,改成如下
def modify(function):
print "modify"
return function @modify
def fun():
print "run a test function" fun()
#输出
#modify
#run a test function
为什么会出现上面问题呢,接下要讲讲这个@+函数名的语法糖的工作原理
...(暂时没有找到讲原理的参考文)
参考:
[1] Mr.Seven
http://www.cnblogs.com/wupeiqi/articles/4980620.html
--------------------谢谢大佬打赏--------------------------

python(十一)面向切面编程AOP和装饰器的更多相关文章
- 面向切面编程 AOP 和装饰器??
1.AOP概念:面向切面编程,指扩展功能不修改源代码,将功能代码从业务逻辑代码中分离出来. 主要功能:日志记录,性能统计,安全控制,事务处理,异常处理等等. 主要意图:将日志记录,性能统计,安全控制, ...
- 设计模式之面向切面编程AOP
动态的将代码切入到指定的方法.指定位置上的编程思想就是面向切面的编程. 代码只有两种,一种是逻辑代码.另一种是非逻辑代码.逻辑代码就是实现功能的核心代码,非逻辑代码就是处理琐碎事务的代码,比如说获取连 ...
- Spring学习手札(二)面向切面编程AOP
AOP理解 Aspect Oriented Program面向切面编程,通过预编译方式和运行期动态代理实现程序功能的统一维护的一种技术. 但是,这种说法有些片面,因为在软件工程中,AOP的价值体现的并 ...
- Spring学习笔记:面向切面编程AOP(Aspect Oriented Programming)
一.面向切面编程AOP 目标:让我们可以“专心做事”,避免繁杂重复的功能编码 原理:将复杂的需求分解出不同方面,将公共功能集中解决 *****所谓面向切面编程,是一种通过预编译方式和运行期动态代理实现 ...
- Spring框架学习笔记(2)——面向切面编程AOP
介绍 概念 面向切面编程AOP与面向对象编程OOP有所不同,AOP不是对OOP的替换,而是对OOP的一种补充,AOP增强了OOP. 假设我们有几个业务代码,都调用了某个方法,按照OOP的思想,我们就会 ...
- Spring之控制反转——IoC、面向切面编程——AOP
控制反转——IoC 提出IoC的目的 为了解决对象之间的耦合度过高的问题,提出了IoC理论,用来实现对象之间的解耦. 什么是IoC IoC是Inversion of Control的缩写,译为控制 ...
- 【串线篇】面向切面编程AOP
面向切面编程AOP 描述:将某段代码“动态”的切入到“指定方法”的“指定位置”进行运行的一种编程方式 (其底层就是Java的动态代理)spring对其做了简化书写 场景: 1).AOP加日志保存到数据 ...
- 04 Spring:01.Spring框架简介&&02.程序间耦合&&03.Spring的 IOC 和 DI&&08.面向切面编程 AOP&&10.Spring中事务控制
spring共四天 第一天:spring框架的概述以及spring中基于XML的IOC配置 第二天:spring中基于注解的IOC和ioc的案例 第三天:spring中的aop和基于XML以及注解的A ...
- [译]如何在ASP.NET Core中实现面向切面编程(AOP)
原文地址:ASPECT ORIENTED PROGRAMMING USING PROXIES IN ASP.NET CORE 原文作者:ZANID HAYTAM 译文地址:如何在ASP.NET Cor ...
随机推荐
- redis设置密码以及jedisPool设置密码
转: redis设置密码以及jedisPool设置密码 2019年01月02日 20:24:43 宇文荒雪 阅读数:1118 版权声明:本文为博主原创文章,未经博主允许不得转载. https:// ...
- myBatis:not bind 问题
[13/07/16 03:25:44:044 CST] localhost-startStop-1 INFO pool.DruidDataSource: {dataSource-1} closed [ ...
- css 中 position属性
position属性详解 文档流 1.html中的布局方式分为三种: 标准流(顺序布局):因为html中的元素大体可以分为两大类(a:块级元素:div .H1-H6. table表格 有序级无序列表 ...
- Dream team: Stacking for combining classifiers梦之队:组合分类器
sklearn实战-乳腺癌细胞数据挖掘(博主亲自录制视频) https://study.163.com/course/introduction.htm?courseId=1005269003& ...
- OS + Windows 10 / office excel vlookup / CredSSP
s https://support.microsoft.com/zh-cn/help/10749/windows-10-find-product-key 查找 Windows 7 或 Windows ...
- mysql清理binlog日志
mysql的binlog日志过多过大,清理过程. 1.查看binlog日志 mysql> show binary logs; +------------------+-----------+ | ...
- 【C#】C#创建自定义Object对象
艹,老是忘!!! }; 记录一下,var obj = new { Name="lily",Age=12};
- C#设计模式(1)——简单工厂模式
1.什么是简单工厂 现实中的工厂负责生产产品,顾名思义,编程中的简单工厂就是一个生产对象的类,它的主要作用是创建具体的产品类实例.我们以一个生产鼠标为例来分析简单工厂的作用,鼠标有两种:戴尔鼠标和惠普 ...
- MongoDB 入门篇
1.1 数据库管理系统 在了解MongoDB之前需要先了解先数据库管理系统 1.1.1 什么是数据? 数据(英语:data),是指未经过处理的原始记录. 一般而言,数据缺乏组织及分类,无法明确的表达事 ...
- Problems found loading plugins: Plugin "GlassFish Integration" was not loaded: required plugin "Java EE: EJB, JPA, Servlets" is disabled.
idea启动报错:并且无法部署web项目 Problems found loading plugins: Plugin "GlassFish Integration" was no ...