装饰器
装饰器的作用:
不想修改函数的调用方式,但是还想在原来的函数添加功能
timmer 就是一个装饰器函数,只是对一个函数 有一些装饰作用
import time #import 调用模块 time.sleep(5) #让程序在执行到这个位置的时候停一会 print('哈哈哈') time.time() #获取当前时间 @timmer #语法糖 def timmer(f): start = time.time() f() end = time.time() print(end - start) def func(): #start = time.time() time.sleep(0.01) print('好') #end = time.time() #print(end - start) timmer(func) def func(): time.sleep(0.01) print() def timmer(func): def inner(): start = time.time() func() end = time.time() print(end - start) return inner func = timmer(func) func()
import 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) print(ret)
开放封闭原则
1.对扩展是开放的
为什么要对扩展开放呢?
我们说,任何一个程序,不可能在设计之初就已经想好了所有的功能并且未来不做任何更新和修改。所以我们必须允许代码扩展、添加新功能。
2.对修改是封闭的
为什么要对修改封闭呢?
就像我们刚刚提到的,因为我们写的一个函数,很有可能已经交付给其他人使用了,如果这个时候我们对其进行了修改,很有可能影响其他已经在使用该函数的用户。
装饰器完美的遵循了这个开放封闭原则。
装饰器的固定模式
def outer(): def inner(): return 'inner' inner() outer()
#装饰器的固定格式——wraps版 from functools import wraps def deco(func): @wraps(func) #加在最内层函数正上方 def wrapper(*args,**kwargs): return func(*args,**kwargs) return wrapper
装饰带参数函数的装饰器
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('sole') return'sole'
def wrapper(f): def inner(*args,**kwargs): ret = f(*args,**kwargs) return ret return inner @wrapper def qqxing(): print(123) ret = qqxing()