装饰器
装饰器的定义:
- 完全遵循开放封闭的原则(开放:增加新功能 封闭:不改变原函数代码)
- 在不改变原函数的代码及调用方式的前提下,为其增加新的功能
- 装饰器的本质就是一个闭包函数
- 装饰器必须放在函数的最上面
def times(f): #1 #3
#此处的f是自由变量(f=func)
def inner(): #4 #7
w_times=time.time() #8
f() #9
e_times=time.time() #13
print(e_times) #14
return inner #此处的inner返回的是func #5
@times # func=times(func) #2 #10
def func():
time.sleep(2) #11
print('王敏敏是憨憨!') #12
func() #此处的func调用的是inner #6
def times(f):
#此处的f是自由变量(f=func)
def inner():
w_times=time.time()
r=f() #此处调用的才是func函数,他的返回值才是666,我们可以把返回值设置一个变量,再把这个变量返回给inner函数
e_times=time.time()
print(e_times)
return r #此处就把666返回给了func(实际上是inner)
return inner #此处的inner返回的是func
@times # func=times(func)
def func():
time.sleep(2)
print('王敏敏最憨憨!')
return 666
ret=func() #此处的ret调用的是inner函数,所以接受不到返回值666,而真正的func函数是times中的自由变量f
print(ret)
def times(f):
#此处的f是自由变量(f=func)
def inner(n):
w_times=time.time()
r=f(n)
e_times=time.time()
print(e_times)
return r #此处就把666返回给了func(实际上是inner)
return inner #此处的inner返回的是func
@times # func=times(func)
def func(a):
time.sleep(2)
print(f'王敏敏最憨憨!{a}')
return 666
ret=func('hhhhh') #借助inner函数进行传参(先把参数传给inner,在把参数传给f(此处的f是func的调用者))
print(ret)
import time
def times(f):
#此处的f是自由变量(f=func)
def inner(*args,**kwargs): #此处是函数的定义,*、**代表聚合 得元组('hhhhh',12)
w_times=time.time()
r=f(*args,**kwargs) #此处是函数的调用,*,**代表打散 得 'hhhhh',12
e_times=time.time()
print(e_times)
return r #此处就把666返回给了func(实际上是inner)
return inner #此处的inner返回的是func
@times # func=times(func)
def func(a,b):
time.sleep(2)
print(f'王敏敏最憨憨!{a}{b}')
return 666
ret=func('hhhhh',12) #借助inner函数进行传参(先把参数传给inner,在把参数传给f(此处的f是func的调用者))
print(ret)
装饰器传参
import time
def fw(path):
def wrapper(f):
def inner(*args, **kwargs):
s = time.strftime('%Y-%m-%d %H:%M:%S')
print(s)
p = f(*args, **kwargs)
s = time.strftime('%Y-%m-%d %H:%M:%S')
with open(path, mode='a', encoding='utf-8')as f1:
f1.write(f'{s}执行了{f.__name__}函数\n')
print(s)
return p
return inner
return wrapper
@fw('time')
def func(a):
print(a)
# time.sleep(3)
return '123'
s=func(10)
print(s)
@fw('time1')
def func2(a):
print(a)
# time.sleep(3)
return '123'
s=func2(10)
print(s)