装饰器基础
小知识:
1,time模块
import time
time.sleep(5) #5秒内什么都不干
print('等了你5秒')
time.time()是从1970年到现在过的秒数。
import time:
a = time.time()
...
b = time.time()
a - b 就是中间...执行的时间秒数。
装饰器的标准用法:
上面是一个在常用函数中增加程序运行计时功能的案例。使用了闭包的方法。多理解一下。
这时,timmer就是一个装饰器。
def timmer(f): #装饰器的名称
def inner(a):
start = time.time()
ret = f(a) #装饰了这个函数。如果需要在被装饰函数中增加返回值,前面必须有一个ret 去接受f()的返回值
end = time.time()
print(end - start)
return ret #为了在被装饰函数中增加返回值,在这里将f()的返回值返回给time(f)
return inner #返回了闭包的结果。注意一定不能加括号,不然就不能返回inner的内存地址了。
@timmer
def func(a):
time.sleep(0.01)
print(‘老板好,同事好,大家好’)
return '新年好'
#func = timmer(func) #同上面的@timmer
func()
一,装饰器的开放封闭原则:
开放:对拓展是开放的(可以对函数和功能进行拓展,而不修改源代码)
封闭:对修改是封闭的(不能直接修改已经写好了的代码)
意义:维护代码的稳定性,在大公司中团体编程的时候非常重要。
使用装饰器就可以做到不修改原本功能的情况下,还可以给函数添加功能。
而且还不影响原来函数的名字。
二,装饰器书写的模式:
上述代码def func()处可以市容如下写法的简写:(但是记得先把装饰器写在需要定义的函数上面。)
@timmer #@装饰器函数名
def func()
三,装饰器的进阶设置:
注意以上操作在原有基础上增加了函数func(a,b)的传入多个位置参数和多个默认参数的功能,并且能将函数func(a)的返回结果正常传出来。
上面这个图多去记忆,以后写装饰器的时候只需要自己规定func功能,并且在装饰器固定位置增加装饰器功能就可以了。运用自如。
以前我有写好的atm程序,但是没有增加数据库的读写功能的,在这里应该就可以用到这个装饰器了,不用每个函数都去添加固定的功能了,
避免了不稳定性,并且也很节约时间。虽然新写的程序暂时还用不到,但是未来总会有一天会用到这个东西的。
四 装饰器的固定模式:
def $装饰器的名称(f):
def inner(*args,**kwargs):
ret = f(*args,**kwargs)
return ret
return inner
@ $装饰器的名称
def $被装饰的函数名(#可以包含任意数量任意类型的形参):
...
return ... #可以返还,也可以不返还
#也可以这样写:
func = $装饰器的名称(func)
ret = func(#形参)