前言
装饰器可能有点陌生, 但是装饰器它也是由函数而组成, 那它有什么作用呢?
其实就是: 不想修改函数的调用方式, 但可在原来的函数前后添加功能. 开放封闭原则:
对扩展是开放的
对修改是封闭的
一, 装饰器初成
1, 还是这个例子, 定义两个函数, func,timmer, 简单来说 func 是执行所需的时间, timmer 是来计算传入的参数执行时长.
2, 可以看到 timmer 函数里面有一个被装饰的函数. 既是 func 传入 timmer.
- # 1. 装饰器初成
- import time
- def func():
- time.sleep(1)
- print('我在等待一秒钟')
- def timmer(f): # 装饰器函数
- def inner():
- start = time.time()
- f() # 被装饰函数
- end = time.time()
- print(end-start)
- return inner # 别加 () 调用函数了, 应传内部函数名字
- ff = timmer(func)
- ff()
3, 运行步骤如下图
二, 装饰器使用
1, 装饰器函数 timmer
2, 被装饰函数 func, 直接 @装饰器函数, 执行顺序如上图所示.
- # 2. 装饰器使用
- import time
- def timmer(f):
- def inner():
- start = time.time()
- ret = f()
- end = time.time()
- return end-start, ret
- return inner
- @timmer # @装饰器函数名
- def func(): # 被装饰的函数
- time.sleep(1)
- return '我在等待一秒钟'
- print(func())
三, 万能参数装饰器
1, 万能传参, 其实就是用我们前面所学的函数传参方法,*args 和 **kwargs
- # 3. 万能参数装饰器
- import time
- def timmer(f):
- def inner(*args, **kwargs): # *args, **kwargs 万能接收参数
- start = time.time()
- ret = f(*args, **kwargs) # *args, **kwargs 万能传入参数
- end = time.time()
- print(end-start)
- return ret
- return inner
- @timmer
- def func(a, b):
- print(a, b)
- time.sleep(1)
- return '我在等待一秒钟'
- @timmer
- def func1(a):
- print(a)
- time.sleep(1)
- return '我在等待一秒钟'
- print(func(1, 2))
- print(func1(1))
四, 装饰器固定模式
1, 装饰器这样我们就可以游刃有余的写: 在被装饰函数之 前 , 后 要做的功能了.
2, 固定模式如下:
- # 4. 装饰器固定模式
- def wrapper(f): # 装饰器函数: wrapper 被装饰函数: f
- def inner(*args, **kwargs): # 被装饰函数: inner == f
- # 在被装饰函数之 前 要做的功能
- ret = f(*args, **kwargs)
- # 在被装饰函数之 后 要做的功能
- return ret
- return inner
- @wrapper # @装饰器函数, 实际相当于: wrapper(fon)
- def fon(a):
- print('打酱油')
- return a
- r = fon('固定模式就是这样') # 实际相当于调用: inner
- print(r)
有没有装饰器都不会影响原函数的执行, 只是能够对现有的进行 前后 扩展, 是不是很有必要掌握好的技能呢?
如有更多欢迎来 QQ 交流群: 482713805
来源: http://www.bubuko.com/infodetail-3352009.html