python装饰器小计
1.装饰器:本质是函数,是用来给其他函数添加附加扩展功能的函数,其返回值是一个函数(函数指针)
2.装饰器作用:不改变函数源代码和函数调用方式的前提下添加函数的附加功能。
3.装饰器储备知识点:
A.高阶函数
B.嵌套函数(闭包函数)
C.“函数即变量”
4.装饰器函数的外部函数传入要装饰的函数名字,返回经过修饰后函数的名字;内层函数(闭包)负责修饰被修饰函数。
实质: 是一个函数
参数:是你要装饰的函数名(并非函数调用)
返回:是装饰好的函数名(也非函数调用)
作用:为已经存在的对象添加额外的功能
特点:不需要对对象做任何的代码上的变动
5.装饰器分类:例子
A.一般装饰器(函数内调用另一个函数)
import time
def decorator(function): #计算出函数function运行时间
start_time=time.time()
function()
stop_time=time.time()
run_time=start_time-stop_time
print("function runs %s"%run_time) def test(): #测试函数
print('in the test') decorator(test) #调用装饰器 执行结果如下:
B.简单装饰器
import time
def decorator(function): #计算出函数function运行时间
start_time=time.time()
function()
stop_time=time.time()
run_time=start_time-stop_time
print("function runs %s"%run_time)
@decorator #被装饰函数定义之前加入@decorator,之后可以直接调用被装饰函数。
def test(): #测试函数
print('in the test') test #调用被装饰函数 执行结果如下:![]()
3.被装饰函数带一个参数的装饰器
import time
def decorator1(function): #计算出函数function运行时间
def decorator2(x): #参数代入
start_time=time.time()
function(x) #参数代入,此处参数名必须与上一步参数名一样
stop_time=time.time()
run_time=start_time-stop_time
print("function runs %s"%run_time)
return decorator2 #返回decorator,此处人的理解是调用decorator1返回decorator2的引用 @decorator1 #被装饰函数定义之前加入@decorator,之后可以直接调用被装饰函数。
def test(args): #测试函数
print('in the test',args) test("argument") #调用被装饰函数,此处实参为字符串argument 执行结果:
4.被装饰函数带多个或者不确定参数个数的装饰器:此处回顾函数参数调用的内容(*args,**kwargs)
import time
def decorator1(function): #计算出函数function运行时间
def decorator2(*args,**kwargs): #参数代入
start_time=time.time()
function(*args,**kwargs) #参数代入,此处参数名必须与上一步参数名一样
stop_time=time.time()
run_time=start_time-stop_time
print("function runs %s"%run_time)
return decorator2 #返回decorator,此处本的理解是两个嵌套函数的逐个调用 @decorator1 #被装饰函数定义之前加入@decorator,之后可以直接调用被装饰函数。
def test(args1,args2): #测试函数
print('in the test',args1,args2) test('multiple','argument') #调用被装饰函数,此处实参为字符串argument 执行结果:
5.自身带参数的装饰器
import time
def decorator1(args1): #args1作用于装饰器decorator1内部
def decorator2(args2): #
def decorator3(*args,**kwargs): #参数代入
start_time=time.time()
for i in range(args1): #args1作用于此
args2(*args,**kwargs) #参数代入,此处参数名必须与上一步参数名一样
stop_time=time.time()
run_time=start_time-stop_time
print("function runs %s"%run_time)
return decorator3 #返回decorator3,此处人的理解是返回decorator3的引用
return decorator2 #返回decorator2,此处人的理解是返回decorator2的引用 @decorator1(3) #被装饰函数定义之前加入@decorator,之后可以直接调用被装饰函数。
def test(args1,args2): #测试函数
print('in the test',args1,args2) test('multiple','argument') #调用被装饰函数,此处实参为字符串argument 执行结果:
6.多个装饰器使用:
import time
def decorator1(x): #args1作用于装饰器decorator1内部
def decorator2(args2): #
def decorator3(*args,**kwargs): #参数代入
start_time=time.time()
for i in range(x): #args1作用于此
args2(*args,**kwargs) #参数代入,此处参数名必须与上一步参数名一样
stop_time=time.time()
run_time=start_time-stop_time
print("function runs %s"%run_time)
return decorator3 #返回decorator3,此处人的理解是返回decorator3的引用
return decorator2 #返回decorator2,此处人的理解是返回decorator2的引用 def decorator4(funct):
def decorator5(*args,**kwargs):
print('-------------decorator4 start-------------')
funct(*args,**kwargs)
print('------------decoratoe4 end here----------')
print('\n')
return decorator5 @decorator1(3) #此处的decorator1装饰了下面的的整体
@decorator4 #此处的decorator4装饰了test
def test(args1,args2): #测试函数
print('in the test',args1,args2) test('multiple','argument') #调用被装饰函数,此处实参为字符串argument
执行结果:
注:A.使用参数时要理解每一个参数代入的量(被装饰函数还是一般参数)
B.多个装饰器嵌套使用尤其要注意装饰的顺序和层次
###新手小白,请多多指正
python装饰器小计的更多相关文章
- Python装饰器小代码
# coding=utf-8import timedef outer(fun): def inner(): start = time.time() fun() runtime = time.time( ...
- python装饰器通俗易懂的解释!
1.python装饰器 刚刚接触python的装饰器,简直懵逼了,直接不懂什么意思啊有木有,自己都忘了走了多少遍Debug,查了多少遍资料,猜有点点开始明白了.总结了一下解释得比较好的,通俗易懂的来说 ...
- Python装饰器由浅入深
装饰器的功能在很多语言中都有,名字也不尽相同,其实它体现的是一种设计模式,强调的是开放封闭原则,更多的用于后期功能升级而不是编写新的代码.装饰器不光能装饰函数,也能装饰其他的对象,比如类,但通常,我们 ...
- Python装饰器与面向切面编程
今天来讨论一下装饰器.装饰器是一个很著名的设计模式,经常被用于有切面需求的场景,较为经典的有插入日志.性能测试.事务处理等.装饰器是解决这类问题的绝佳设计,有了装饰器,我们就可以抽离出大量函数中与函数 ...
- 一篇关于Python装饰器的博文
这是一篇关于python装饰器的博文 在学习python的过程中处处受阻,之前的学习中Python的装饰器学习了好几遍也没能真正的弄懂.这一次抓住视频猛啃了一波,就连python大佬讲解装饰器起来也需 ...
- python 装饰器 一篇就能讲清楚
装饰器一直是我们学习python难以理解并且纠结的问题,想要弄明白装饰器,必须理解一下函数式编程概念,并且对python中函数调用语法中的特性有所了解,使用装饰器非常简单,但是写装饰器却很复杂.为了讲 ...
- Python 装饰器(Decorator)
装饰器的语法为 @dec_name ,置于函数定义之前.如: import atexit @atexit.register def goodbye(): print('Goodbye!') print ...
- Python装饰器探险
关于python装饰器的理解和用法,推荐廖雪峰老师和这一篇博客以及知乎 以下代码均已手动敲过,看完本篇内容,包你装饰器小成! 装饰器实际上就是为了给某程序增添功能,但该程序已经上线或已经被使用,那么就 ...
- Python装饰器的通俗理解
转载:http://blog.csdn.net/u013471155 在学习Python的过程中,我相信有很多人和我一样,对Python的装饰器一直觉得很困惑,我也是困惑了好久,并通过思考和查阅才能略 ...
随机推荐
- Android增量升级的方法和原理
总结: 我们使用delta编码算法减少Android应用升级程序的大小.我们通过bsdiff和bspatch工具在android上实现delta编码算法.服务器软件和android应用已经部署.当前, ...
- 使用Multiplayer Networking做一个简单的多人游戏例子-3/3(Unity3D开发之二十七)
使用Multiplayer Networking做一个简单的多人游戏例子-1/3 使用Multiplayer Networking做一个简单的多人游戏例子-2/3 使用Multiplayer Netw ...
- 【面试笔试算法】Problem 8: 然而沼跃鱼早就看穿了一切(hiho题库)
时间限制:1000ms 单点时限:1000ms 内存限制:256MB 描述 fjxmlhx每天都在被沼跃鱼刷屏,因此他急切的找到了你希望你写一个程序屏蔽所有句子中的沼跃鱼("marshtom ...
- Android Preference详解
转载请标明出处:ttp://blog.csdn.net/sk719887916/article/details/42437253 Preference 用来管理应用程序的偏好设置和保证使用这些的每个应 ...
- SpriteBuilder中关于大量CCB文件的数字命名建议
开发者总是频繁的填充文件名字使用额外的0,以此来对抗长久以来的长痘:数字排序.如果你觉得在数字名字前添加额外的0是一个好主意,比如说Level0001,因为可能你会创建数以千记的关卡--请不要这样做! ...
- linux 网络不通问题排查
基本的排错步骤(从上往下)ping 127.0.0.1ping的通说明tcp协议栈没有问题ping 主机地址 ping的通说明网卡没有问题ping 路由器默认网关 ping的通说明包可以到达路由器最后 ...
- CentOS 7下编译安装Boost_1_57_0
之前对库的理解太肤浅(现在也仍很肤浅),导致走了挺多的弯路,现记录以备后查. 现在可以从Boost官网下载到最新的Boost源代码boost_1_57_0.tar.gz. 现将步骤记录如下: 1. 解 ...
- unix下的ACL
acl可以针对user,组,目录默认属性(mask)来控制. acl需要文件系统支持,ext2/3,jfs,xfs等都支持. getfacl setfacl 对于mac os X系统的acl 可以使用 ...
- 如何获取自己想要模拟的APP的相关图片?
一.首先打开iTunes APP,找到自己想要模拟实现的APP,并下载 二.找到下载的APP在iTunes中的位置 三.选中对应的APP,点击右键选择在Finder中显示,会打开对应的文件窗口,打开对 ...
- asp.net 下的中文分词检索工具 - jieba.net
jieba是python下的一个检索库, 有人将这个库移植到了asp.net 平台下, 完全可以替代lucene.net以及盘古分词的搭配 之所以写这个, 其实是因为昨天面试时, 被问到网站的关键字检 ...




