自学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开发,我们从今天开始要去公司上班 ...
随机推荐
- 出题人的女装(牛客练习赛38题B) (概率+分式运算)
链接:https://ac.nowcoder.com/acm/contest/358/B来源:牛客网 出题人的女装 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 524288K,其他 ...
- Day1 Numerical simulation of optical wave propagation之标量衍射理论基本原理(一)
<Numerical simulation of optical wave propagation>内容 1. 介绍光波传输的基础理论.离散采样方法.基于MATLAB平台的编码实例以及具 ...
- Python_字典及其操作
字典 概念 字典,Python基础数据类型之一,{}以键值对的形式存储数据. 以key : value 形式存储数据.例如,name 为 key,Laonanhai 为 value. dic = {' ...
- Python_内置函数之map()
map 会根据提供的函数对指定序列做映射. 代码如下: def square(x): return x ** 2 ret = map(square, [1, 2, 3, 4, 5]) # 计算列表各元 ...
- 【问题解决方案】Dev C++ 无法调试的问题与解决
听翁恺老师课的时候用到一个叫DevC++的编辑器. 学到调试部分的时候,老师的没问题我的报错.我?? 试一试网上查到的方法: 工具 --> 编译选项 --> 代码生成/优化 --> ...
- Python3练习题 006 冒泡排序
import random a = [random.randint(1,100) for i in range(10)]def bu(target): length = len(target) whi ...
- 三、Object 对象常用操作方法
Object 构造方法 一.asign vs 扩展运算符 ... 1.共同点:都是浅拷贝 2.开发推荐 扩展运算符... let obj={ name: 'Tom', age: 18 }; let o ...
- java类库
Java的应用程序接口(API)以包的形式来组织,每个包提供大量的相关类.接口和异常处理类,这些包的集合就是Java的类库. Java类库可以分为两种 包名以java开始的包是Java核心包(Java ...
- 【学亮IT手记】jQuery each()函数用法实例
<!DOCTYPE html> <html> <head> <meta charset="utf-8"> <script sr ...
- Day 5-6 反射和内置方法之item系列
python面向对象中的反射:通过字符串的形式操作对象相关的属性.python中的一切事物都是对象(都可以使用反射) #!_*_ coding:utf-8 _*_ class People: def ...