python-day13--装饰器
1.开放封闭的原则:
1.对扩展是开放的
为什么要对扩展开放呢?
我们说,任何一个程序,不可能在设计之初就已经想好了所有的功能并且未来不做任何更新和修改。所以我们必须允许代码扩展、添加新功能。
2.对修改是封闭的
为什么要对修改封闭呢?
就像我们刚刚提到的,因为我们写的一个函数,很有可能已经交付给其他人使用了,如果这个时候我们对其进行了修改,很有可能影响其他已经在使用该函数的用户。
装饰器完美的遵循了这个开放封闭原则。
2.装饰器的功能: 在不改变函数调用方式的基础上在函数的前、后添加功能。
3.装饰器的本质: 一个闭包函数
4.装饰器的固定格式:
def (func):
def inner(*args,**kwargs):
'''函数执行前要做的'''
r=func(*args,**kwargs)
'''函数执行后要做的'''
return r
return inner
5.语法糖+带参数+带返回值+多个函数
import time
def timer(func):
def inner(*args,**kwargs):
start=time.time()
r=func(*args,**kwargs)
end=time.time()
print(end - start)
return r
return inner
@timer #==> func1 = timer(func1)
def func1(a,b):
print('%s'%(a+b))
return 'eva'
@timer
def func2(a):
print('%s'%(a))
return 'eva'
s=func1(1,2)
q=func2('hello')
print(s)
print(q)
6.装饰器的一个小应用:
l = []
def wrapper(func):
l.append(func)
# l.append(func) #统计当前程序中有多少个函数被装饰了
def inner(*args,**kwargs):
#l.append(func) #统计本次程序执行有多少个带这个装饰器的函数被调用了
ret = func(*args,**kwargs)
return ret
return inner
@wrapper #f1 = wrapper(f1)
def f1():
print('in f1')
@wrapper #f2 = wrapper(f2)
def f2():
print('in f2')
@wrapper #f2 = wrapper(f2)
def f3():
print('in f3')
# f1()
# f2()
print(len(l))