装饰器可能有点陌生,可是装饰器它也是由函数而组成,那它有什么做用呢?app
其实就是:不想修改函数的调用方式,但可在原来的函数先后添加功能。开放封闭原则:函数
一、仍是这个例子,定义两个函数,func、timmer,简单来讲 func 是执行所需的时间,timmer 是来计算传入的参数执行时长。spa
二、能够看到timmer函数里面有一个被装饰的函数。既是 func 传入 timmer。code
# 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()
三、运行步骤以下图blog
一、装饰器函数 timmerclass
二、被装饰函数 func,直接@装饰器函数,执行顺序如上图所示。import
# 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())
一、万能传参,其实就是用咱们前面所学的函数传参方法,*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))
一、装饰器这样咱们就能够游刃有余的写:在被装饰函数之 前 、后 要作的功能了。方法
二、固定模式以下:im
# 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