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的装饰器一直觉得很困惑,我也是困惑了好久,并通过思考和查阅才能略 ...
随机推荐
- EventBus 最简易的使用方式
呃,要跟上时代的步伐,所以来学习一下EventBus(话说好像现在学也已经算是跟不上了..嘛..不管了,一步一步往前追,应该还来得及吧). 转载请注明出处:http://blog.csdn.net/w ...
- (视频)《快速创建网站》2.1 在Azure上创建网站及网站运行机制
现在让我们开始一天的建站之旅. 本文是<快速创建网站>系列的第2篇,如果你还没有看过之前的内容,建议你点击以下目录中的章节先阅读其他内容再回到本文. 1. 网站管理平台WordPress和 ...
- CentOS 6.X启动流程
CentOS 6.X启动流程 /boot分区 启动引导程序是默认可以识别boot分区的.因此在系统还无法加载硬盘的时候,boot分区是可以识别的! initramfs内存文件系统 CentOS 6.x ...
- 使用 Linux 的 strace 命令跟踪/调试程序的常用选项
原文:http://linoxide.com/linux-command/linux-strace-command-examples/作者: Raghu 在调试的时候,strace能帮助你追踪到一个程 ...
- 写一个dup2功能相同的函数,不能调用 fcntl 函数,并且要有出错处理
实现的时候用到系统原来的dup函数 // mydup2.c // 2015/08/17 Lucifer Zhang version1.0 // write my own dup2 function / ...
- windows linux—unix 跨平台通信集成控制系统----文件搜索
跨平台的网络通信,跟设备的集成控制,牵扯到在各种平台下的文件搜索问题,windows下面的已经有了. 地址如下: http://blog.csdn.net/wangyaninglm/article/d ...
- SharePoint2007 管理中心TimerJob”计时器作业定义”页面报错
部署完成自己开发的TimerJob,发现"计时器作业定义"页面报错,进不去了,但是TimerJob可以正常运行,这样,肯定不行的,估计还是代码有问题,把这个脆弱的sharepoin ...
- vector向量容器的一些基本操作
#include <vector> #include <iostream> using namespace std; void print(vector<int>& ...
- MASM中3中文本宏的使用与区别
= 宏 格式 : name = exp 其中,exp只能为32位整数值,且用=宏定义的符号名称可以重定义: EQU 宏 格式1:name EQU exp exp为有效整数值,可以重定义: 格式2:na ...
- CF633G
题目大意: 给你一棵树,根节点为1 有2种操作,第一种是给u节点所在的子树的所有节点的权值+x 第二种是询问,假设v是子树u中的节点,有多少种质数满足av = p + m·k 做法:维护子树信息显然d ...




