python-17-装饰器形成固定模型
作者:互联网
前言
装饰器可能有点陌生,但是装饰器它也是由函数而组成,那它有什么作用呢?
其实就是:不想修改函数的调用方式,但可在原来的函数前后添加功能。开放封闭原则:
- 对扩展是开放的
- 对修改是封闭的
一、装饰器初成
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
标签:return,函数,17,python,timmer,time,固定模型,装饰,def 来源: https://www.cnblogs.com/gsxl/p/12104996.html