python 装饰器的理解
一、
装饰器是一个很著名的设计模式,经常被用于有切面需求的场景,较为经典的有插入日志、性能测试、事务处理等。装饰器是解决这类问题的绝佳设计,有了装饰器,我们就可以抽离出大量函数中与函数功能本身无关的雷同代码并继续重用。概括的讲,装饰器的作用就是为已经存在的对象添加额外的功能。
二、装饰器工作原理。
遵循编程的闭合原则,在不修改原函数代码的基础上增加功能,使用装饰器是一种很好的选择。
装饰器工作基于以下两步完成:
第一步:被装饰的函数作为参数传给装饰器函数,并执行装饰器函数,返回值记作newFunction;
第二步:原函数名重新被赋值为newFunction。
def auth(fun): #定义装饰器
def inner():
print("The test code")
fun()
print("after")
return inner @auth #相当于 f1 = auth(f1) 也叫加载装饰器
def f1(): #被装饰的函数
print("----f1执行过程----") f1() #调用函数 #执行结果为 The test code
# ----f1执行过程----
# after
当执行f1函数时,首先执行装饰器auth,并将原f1函数作为参数传递给装饰器函数,装饰器返回一个inner函数并将该函数赋值给f1,即f1() = inner()
auth 这个函数实现的功能是,接收一个函数作为参数然后返回创建的另一个函数f1()=inner(),在这个创建的函数里调用接收的函数(文字比代码绕人)
三、动态参数,装饰含有N个参数的函数。
def auth(fun): #定义装饰器
def inner(*args,**kwargs): #定义动态参数
print("The test code")
fun(*args,**kwargs) #将动态参数传给原函数
print("after")
return inner @auth #相当于 f1 = auth(f1) 也叫加载装饰器
def f1(): #被装饰的函数
print("----f1执行过程----\n===========")
@auth
def f2(name,age):
print("f2执行过程:name is + %s; age is + %s" %(name,age))
f2("gyc",33) #执行结果为
#The test code
#f2执行过程:name is + gyc; age is + 33
#after
装饰含有不同参数个数及格式的函数,可以给装饰器定义动态参数,由装饰器将动态参数传递给原函数
四、装饰有返回值的函数。
def outer(func): #定义装饰器
def inner(*args,**kwargs): #为inner函数定义返回值
print("执行原函数之前")
r = func(*args,**kwargs) #接受原函数的返回值
print("执行原函数之后")
return r #返回原函数的返回值
return inner
@outer
def f1():
print("f1执行过程")
@outer
def f2(name,age):
print("f2执行过程")
rst = 'name is '+name+';age is'+age
return rst r1 = f1()
print("不接受参数,且无返回值:%s"%r1) r2 = f2('gyc','')
print("接受参数,且有返回值:%s"%r2)
执行结果
五、多层装饰器(同时加载多个装饰器)

六、带参数的装饰器

带参数的装饰器更为灵活,可以接收任意函数作为参数,然后动态生成新的基础装饰器,然后用新装饰器去装饰原函数。
这样,可以指定在原函数执行前运行某一个程序,在原函数执行之后运行另一个程序。
python 装饰器的理解的更多相关文章
- 转发对python装饰器的理解
[Python] 对 Python 装饰器的理解的一些心得分享出来给大家参考 原文 http://blog.csdn.net/sxw3718401/article/details/3951958 ...
- python 装饰器的理解以及类装饰器
python装饰器的作用就是在不改变原有函数结构的情况下给该函数增加一个新功能,就是不入侵到原来函数里面修改代码给其增加一个新功能 先看代码 def out(fn): def inner(*args, ...
- python 装饰器 (个人理解就是前置的内建函数)
感谢有篇文件详细介绍[简单 12 步理解 Python 装饰器]http://python.jobbole.com/85056/ 1.首先介绍内建函数 2.转换为装饰器 3.执行顺序 4.装饰器实用
- python装饰器的理解
学习python,发现装饰器是一个比较难理解的地方. 下面用代码来说明. 装饰器的作用是为了切面编程(AOP).这种编程在java上有很多实现方式.下面直接说明吧: 1.作为装饰器的函数至少有两个de ...
- 总结了11条,我对Python 装饰器的理解
对于每一个学习 Python 的同学,想必对 @ 符号一定不陌生了,正如你所知, @ 符号是装饰器的语法糖,@符号后面的函数就是我们本文的主角:装饰器. 装饰器放在一个函数开始定义的地方,它就像一顶帽 ...
- 谈谈对Python装饰器的理解
装饰器,又名函数修饰符.笔者觉得函数修饰符,这个名字更能直观的反应他的作用. 函数修饰符语法特征 : @ + 修饰符 函数修饰符的装饰对象: 函数修饰符,就是说他修饰的是 ...
- Python装饰器的通俗理解
转载:http://blog.csdn.net/u013471155 在学习Python的过程中,我相信有很多人和我一样,对Python的装饰器一直觉得很困惑,我也是困惑了好久,并通过思考和查阅才能略 ...
- (一)Python装饰器的通俗理解
在学习Python的过程中,我相信有很多人和我一样,对Python的装饰器一直觉得很困惑,我也是困惑了好久,并通过思考和查阅才能略有领悟,我希望以下的内容会对你有帮助,我也努力通过通俗的方式使得对Py ...
- Python 装饰器学习
Python装饰器学习(九步入门) 这是在Python学习小组上介绍的内容,现学现卖.多练习是好的学习方式. 第一步:最简单的函数,准备附加额外功能 1 2 3 4 5 6 7 8 # -*- c ...
随机推荐
- [LeetCode] Minimum Window Substring 最小窗口子串
Given a string S and a string T, find the minimum window in S which will contain all the characters ...
- linux基础-磁盘阵列(RAID)实例详解
磁盘阵列(RAID)实例详解 raid技术分类 软raid技术 硬raid技术 Raid和lvm的区别 为什么选择用raid RAID详解 RAID-0 RAID-1 RAID-5 Raid-10 R ...
- 1229【MySQL】性能优化之 Index Condition Pushdown
转自http://blog.itpub.net/22664653/viewspace-1210844/ [MySQL]性能优化之 Index Condition Pushdown2014-07-06 ...
- Mysql字符串字段判断是否包含某个字符串的3种方法
方法一: SELECT * FROM users WHERE emails like "%b@email.com%"; 方法二: 利用MySQL 字符串函数 find_in_set ...
- Javascript自执行匿名函数(function() { })()的原理分析
匿名函数指没有指定函数名或指针的函数,自执行匿名函数只是其中一种,下文中称这种函数为:自执行函数 下面是一个最常见的自执行函数: // 传统匿名函数 (function() { alert('hell ...
- 净捡软柿子捏--jQuery 遍历方法
---------------------------------------------add()------------------------------------------ jquery. ...
- RabbitMQ 集群+负载均衡
负载均衡 集群的配置已经搭建好了,代码也成功跑通,成功做到了高可用,但是我们的程序连接节点并不会管哪个服务器在忙.哪个服务器空闲,完全看心情想连谁就连谁.而且代码中要把每个ip的节点都手动的写出来 , ...
- Oracle创建自增ID
先创建序列sequence create sequence S_User minvalue 1 nomaxvalue -- 或 maxvalue 999 start with 1 increment ...
- 【ASP.NET程序员福利】打造一款人见人爱的ORM(一)
“很多人都不太认可以第三方ORM,因为考虑的点不够全面,没有大用户群体的ORM有保证,这点是不可否认确是事实.但是往往用户群体大的ORM又有不足之处,今天我们就来聊聊关于ORM的话题,打造 ...
- Nginx 和 IIS 实现动静分离
前段时间,搞Nginx+IIS的负载均衡,想了解的朋友,可以看这篇文章:<nginx 和 IIS 实现负载均衡>,然后也就顺便研究了Nginx + IIS 实现动静分离.所以,一起总结出来 ...