自学Python4.3-装饰器固定格式
自学Python之路-Python基础+模块+面向对象
自学Python之路-Python网络编程自学Python之路-Python并发编程+数据库+前端自学Python之路-django
自学Python4.3-装饰器固定格式
1.装饰有返回值的装饰器
- import time
- print(time.time())
- def timmer(f): #装饰器函数
- def inner():
- start = time.time()
- ret = f() #被装饰的函数
- end = time.time()
- print(end - start)
- return ret
- return inner
- @timmer #语法糖 @装饰器函数名
- def func(): #被装饰的函数
- time.sleep(0.01)
- print('我好喜欢大家啊~')
- return '新年好'
- # func = timmer(func)
- ret = func() #inner()
- print(ret)
以上代码:
执行timmer(func), 返回inner (此时此刻func就是inner) 执行func的时候就是执行inner, 所以在inner里面加个返回值
2. 装饰带参数函数的装饰器
2.1 如果被装饰函数有参数, 有一个参数:
- import time
- print(time.time())
- def timmer(f): #装饰器函数
- def inner(a):
- start = time.time()
- ret = f(a) #被装饰的函数
- end = time.time()
- print(end - start)
- return ret
- return inner
- @timmer #语法糖 @装饰器函数名
- def func(a): #被装饰的函数
- time.sleep(0.01)
- print('我好喜欢大家啊',a)
- return '新年好'
- # func = timmer(func)
- ret = func(1) #inner()
- print(ret)
2.2 如果被装饰函数有参数, 有2个参数:
- import time
- print(time.time())
- def timmer(f): #装饰器函数
- def inner(a,b):
- start = time.time()
- ret = f(a,b) #被装饰的函数
- end = time.time()
- print(end - start)
- return ret
- return inner
- @timmer #语法糖 @装饰器函数名
- def func(a,b): #被装饰的函数
- time.sleep(0.01)
- print('我好喜欢大家啊',a,b)
- return '新年好'
- # func = timmer(func)
- ret = func(2598,2417) #inner()
- print(ret)
2.3 如果被装饰函数有2个,一个函数有1个参数, 另一个函数有2个参数:
- import time
- print(time.time())
- def timmer(f): #装饰器函数
- def inner(*args):
- start = time.time()
- ret = f(*args) #被装饰的函数
- end = time.time()
- print(end - start)
- return ret
- return inner
- @timmer #语法糖 @装饰器函数名
- def func1(a): #被装饰的函数func1
- time.sleep(0.01)
- print('我好喜欢大家啊',a)
- return '新年好'
- # func = timmer(func)
- def func2(a,b): #被装饰的函数func2
- time.sleep(0.01)
- print('我爱大家啊',a,b)
- return '过年好'
- # func = timmer(func)
- ret = func1(48785) #inner()
- ret = func2(2598,2417) #inner()
- print(ret)
以上只解决了按位置传参数, 但是如果按关键字传参数就会有问题。于是, 可传万能参数
- import time
- print(time.time())
- def timmer(f): #装饰器函数
- def inner(*args,**kwargs):
- start = time.time()
- ret = f(*args,**kwargs) #被装饰的函数
- end = time.time()
- print(end - start)
- return ret
- return inner
- @timmer #语法糖 @装饰器函数名
- def func1(a): #被装饰的函数func1
- time.sleep(0.01)
- print('我好喜欢大家啊',a)
- return '新年好'
- # func = timmer(func)
- def func2(a,b): #被装饰的函数func2
- time.sleep(0.01)
- print('我爱大家啊',a,b)
- return '过年好'
- # func = timmer(func)
- ret = func1(48785) #inner()
- ret = func2(2598,b=2) #inner()
- print(ret)
3. 引出---装饰器的固定格式
- def wrapper(f): #装饰器函数,f是被装饰的函数
- def inner(*args,**kwargs):
- '''在被装饰函数之前要做的事'''
- ret = f(*args,**kwargs) #被装饰的函数
- '''在被装饰函数之后要做的事'''
- return ret
- return inner
- @wrapper #语法糖 @装饰器函数名
- def func(a,b): #被装饰的函数
- time.sleep(0.01)
- print('我好喜欢大家',a,b)
- return '新年好'
- ret = func()
注意点:
- func 是被装饰的函数
- 调用所有被装饰的函数,其实就是调用的inner
单独打印*args,会将参数打散,输出每一个参数。(接收是聚合,调用是打散)
所以以下的例子,inner(*args) 相当于inner(1,2,3,4)
举例代码:
- def wrapper(func):
- def inner(*args,**kwargs):
- print('在被装饰的函数执行之前做的事')
- ret = func(*args,**kwargs)
- print('在被装饰的函数执行之后做的事')
- return ret
- return inner
- @wrapper #holiday = wrapper(holiday)
- def holiday(day):
- print('全体放假%s天'%day)
- return '好开心'
- ret = holiday(3)
- print(ret)
- 1. 执行def wrapper(func) ,放到内存
- 2. 执行holiday=wrapper(holiday)的右部分,传给wrapper下面代码
- 3. 执行def inner(*args,**kwargs)
- 4. return inner 返回地址
- 5. 返回地址给holiday , 赋值
- 6. 执行ret=holiday(3)右部分, 就是相当于inner(3)
- 7. 执行inner函数,print('在被装饰的函数执行之前做的事')
- 8. ret = func(*args,**kwargs) 相当于holiday(*(3),**{})
- 9. 执行函数holiday(3),print('全体放假%s天'%day)
- 10. return “好开心”
- 11. 返回值给ret = func(*args,**kwargs) 的左部分
- 12. print('在被装饰的函数执行之后做的事')
- 13. return ret ,拿到返回值“好开心”
- 14.返回值给holiday=wrapper(holiday)的左部分
- 15.print(ret)
...
自学Python4.3-装饰器固定格式的更多相关文章
- 自学Python4.4-装饰器的进阶
自学Python之路-Python基础+模块+面向对象自学Python之路-Python网络编程自学Python之路-Python并发编程+数据库+前端自学Python之路-django 自学Pyth ...
- 自学Python4.5-装饰器举例
自学Python之路-Python基础+模块+面向对象自学Python之路-Python网络编程自学Python之路-Python并发编程+数据库+前端自学Python之路-django 自学Pyth ...
- 自学Python4.2-装饰器
自学Python之路-Python基础+模块+面向对象自学Python之路-Python网络编程自学Python之路-Python并发编程+数据库+前端自学Python之路-django 自学Pyth ...
- 自学Python4.6-迭代器
自学Python之路-Python基础+模块+面向对象自学Python之路-Python网络编程自学Python之路-Python并发编程+数据库+前端自学Python之路-django 自学Pyth ...
- python--4、装饰器
装饰器(Decorator) 使用场景:为被装饰器装饰的函数增加功能,但又不希望修改函数的定义,即在代码运行期间动态增加功能. 装饰器更多的用于后期功能升级而不是编写新的代码.装饰器不光能装饰函数,也 ...
- day11(python)装饰器
def wrapper(f):#1 def inner(*args,**kwargs):#3 ret = f(*args,**kwargs)#5 return ret#8 return inner#4 ...
- python基础-5.2装饰器
1.了解装饰器前准备 #### 第一波 #### def foo(): print 'foo' foo #表示是函数,仅指向了函数的地址,为执行 foo() #表示执行foo函数 #### 第二波 # ...
- python之装饰器函数
本章内容 引入 装饰器的形成过程 开放封闭原则 谈装饰器主要功能和装饰器固定结构 带参数的装饰器 多个装饰器装饰一个函数 引入 作为一个会写函数的python开发,我们从今天开始要去公司上班了.写了一 ...
- python之路——装饰器函数
阅读目录 楔子 装饰器的形成过程 开放封闭原则 谈装饰器主要功能和装饰器固定结构 带参数的装饰器 多个装饰器装饰一个函数 返回顶部 楔子 作为一个会写函数的python开发,我们从今天开始要去公司上班 ...
随机推荐
- R语言绘制茎叶图
与直方图相比,茎叶图更能细致的看出数据分布情况! 代码: > x<-c(25, 45, 50, 54, 55, 61, 64, 68, 72, 75, 75,+ 78, 79, 81, 8 ...
- ssm知识点总结
项目名称:教育网—在线调查系统 项目总体流程图: 设计调查:调查-->包裹--->问题(增删改查) 1.调整包裹顺序 2.移动复制包裹 3.深度删除 创建调查流程分析: 主要生成surve ...
- python札记
进制转换 num = "0011"v = int(num, base=16)print(v)2->16
- [options] 未与 -source 1.6 一起设置引导类路径
用ant与eclipse编译Cassandra 1.2.19,出现了“ [options] 未与 -source1.6一起设置引导类路径”的警告,并出现了一些编译错误,提示编译失败,上网找了很 多资料 ...
- 福州大学软件工程1816 | W班 第8次作业[团队作业,随堂小测——校友录]
作业链接 团队作业,随堂小测--校友录 评分细则 本次个人项目分数由两部分组成(博客分满分40分+程序得分满分60分) 博客和程序得分表 评分统计图 千帆竞发图 总结 旅法师:实现了更新,导出,查询, ...
- winform自定义控件开发
1.添加控件属性 //添加私有的控件属性 private string djm;//单据名 //添加属性描述 [Browsable(true)] [Description("djm" ...
- RabbitMQ基本操作
更加详细的 链接https://www.cnblogs.com/dwlsxj/p/RabbitMQ.html RabbitMQ基础知识 一.背景 RabbitMQ是一个由erlang开发的AMQP(A ...
- python之路--MySQL权限管理 数据备份还原
一 权限管理 mysql最高管理者是root用户, 这个一般掌握在公司DBA手里, 当你想去对数据库进行一些操作的时候,需要DBA授权给你. 1. 对新用户增删改 1. 创建用户 # 要先use my ...
- python之路-字符串
一.类型转换 a = 10 print(type(a)) # <class 'int'> d = str(a) # 把数字转换成str print(type(d)) # <class ...
- codeforces525B
Pasha and String CodeForces - 525B Pasha got a very beautiful string s for his birthday, the string ...