二、装饰器

装饰器可以在给函数修改功能的同时并不改变这个函数本身。(以下用的都是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和装饰器的更多相关文章

  1. 面向切面编程 AOP 和装饰器??

    1.AOP概念:面向切面编程,指扩展功能不修改源代码,将功能代码从业务逻辑代码中分离出来. 主要功能:日志记录,性能统计,安全控制,事务处理,异常处理等等. 主要意图:将日志记录,性能统计,安全控制, ...

  2. 设计模式之面向切面编程AOP

    动态的将代码切入到指定的方法.指定位置上的编程思想就是面向切面的编程. 代码只有两种,一种是逻辑代码.另一种是非逻辑代码.逻辑代码就是实现功能的核心代码,非逻辑代码就是处理琐碎事务的代码,比如说获取连 ...

  3. Spring学习手札(二)面向切面编程AOP

    AOP理解 Aspect Oriented Program面向切面编程,通过预编译方式和运行期动态代理实现程序功能的统一维护的一种技术. 但是,这种说法有些片面,因为在软件工程中,AOP的价值体现的并 ...

  4. Spring学习笔记:面向切面编程AOP(Aspect Oriented Programming)

    一.面向切面编程AOP 目标:让我们可以“专心做事”,避免繁杂重复的功能编码 原理:将复杂的需求分解出不同方面,将公共功能集中解决 *****所谓面向切面编程,是一种通过预编译方式和运行期动态代理实现 ...

  5. Spring框架学习笔记(2)——面向切面编程AOP

    介绍 概念 面向切面编程AOP与面向对象编程OOP有所不同,AOP不是对OOP的替换,而是对OOP的一种补充,AOP增强了OOP. 假设我们有几个业务代码,都调用了某个方法,按照OOP的思想,我们就会 ...

  6. Spring之控制反转——IoC、面向切面编程——AOP

      控制反转——IoC 提出IoC的目的 为了解决对象之间的耦合度过高的问题,提出了IoC理论,用来实现对象之间的解耦. 什么是IoC IoC是Inversion of Control的缩写,译为控制 ...

  7. 【串线篇】面向切面编程AOP

    面向切面编程AOP 描述:将某段代码“动态”的切入到“指定方法”的“指定位置”进行运行的一种编程方式 (其底层就是Java的动态代理)spring对其做了简化书写 场景: 1).AOP加日志保存到数据 ...

  8. 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 ...

  9. [译]如何在ASP.NET Core中实现面向切面编程(AOP)

    原文地址:ASPECT ORIENTED PROGRAMMING USING PROXIES IN ASP.NET CORE 原文作者:ZANID HAYTAM 译文地址:如何在ASP.NET Cor ...

随机推荐

  1. JQERY EasyUI Tabs 选项卡 自适应浏览器宽度高度 解决方案

    <script type="text/javascript"> $(window).resize(function () { $('#tt').tabs({ width ...

  2. Luogu P2922 [USACO08DEC]秘密消息Secret Message 字典树 Trie树

    本来想找\(01Trie\)的结果找到了一堆字典树水题...算了算了当水个提交量好了. 直接插入模式串,维护一个\(Trie\)树的子树\(sum\)大小,求解每一个文本串匹配时走过的链上匹配数和终点 ...

  3. vbox的桥接网络

    直接连接到了外网上,宿主机可以访问虚拟机,但是虚拟机不可以访问宿主机.缺点:宿主机没有网络时,将不能ping通. 宿主机:win10 网络:无线 虚拟机系统:centos6.5 vbox版本:6.0. ...

  4. 设计模式--桥接(Bridge)模式

    1.概述: 桥接模式:把抽象和行为分离开来,中间需要某个介质来连接抽象化和行为化.此模式的概述听起来非常像适配器模式,不要搞混了,虽然都是借用中间介质,但意义不同.最典型的桥接模式就是:JDBC.通过 ...

  5. 设计模式---接口隔离模式之门面模式(Façade)

    前提:接口隔离模式 在组建构建过程中,某些接口之间直接的依赖常常会带来很多问题.甚至根本无法实现.采用添加一层间接接口(稳定的),来隔离本来相互紧密关联的接口是一种常见的解决方案. 典型模式: 门面模 ...

  6. entityManager分页

    十分操蛋. 需要两步. 第一步,查询一共需要多少条. 第二步   分页得到数据 Query query = this.entityManager.createNativeQuery(sb2.toStr ...

  7. .NET技术-1.0.使用反射、特性简化代码(验证Model类)

    使用反射.特性简化代码 参考项目:利用反射验证Model类/AssemblyVerification 假设现在有一个学生类(Student) /// <summary> /// 学生类 / ...

  8. python 面向对象(一)初识面向对象

    ##################################总结#################### 1. 面向过程:一切以事物的发展流程为中心 面向对象:一切以对象为中心,一切皆为对向, ...

  9. 关于Mysql的高级查询的操作

    前言:作为一名后端的程序员操作数据库的能力是我们基本的技能,而连表查询是我们的这个技能的关键点所在.注意这里顾明思义是对数据的查询的操作 (一).联合查询(关键字union/union all) 什么 ...

  10. HDU 1034(传递糖果 模拟)

    题意是一群孩子围成一个圈,每个人把手中的糖果分一半给右边的人,若分过之后手中的糖果数是奇数,则由老师提供一颗糖果给他,问这样传递多少圈所有人的糖果数都能相等,最终每人手里的糖果数是多少. 由于题中已经 ...