装饰器
一,装饰器必备知识
1,
def f1():
print("123")
def f1():
print(456)
f1() #在执行f1()函数时,会把上面一个f1函数给覆盖掉
结果:
456
2,
def f1():
print(123)
def f2(xxx):
xxx()
f2(f1) #此时f2中的xxx就相当于f1,看清是f1整体,而不是f1(),
#说明函数可以作为一个参数传递函数
二,装饰器流程剖析
def outer(func): #装饰器函数
def inner():
print("ok")
func()
print("no")
return inner
@outer
def f1():
print("F1")
f1()
装饰器的核心总结:
@ + 函数名
功能:1,自动执行outer函数,并将其下面的函数(f1,f2,f3)作为参数传递
2,将outer函数的返回值,重新赋值给f1,覆盖了原来f1。
应用场景:在不改变原函数的情况下,统一增加新的功能和操作。
三,装饰器流程剖析之返回值
def outer(func): #装饰器函数
def inner():
print("ok")
r = func() #不能直接返回return r,因为return之后的不行执行
print("no") #会导致后来的操作失效,这是一个完整的装饰器。
return r
return inner
@outer
def f1():
print("F1")
return "hello world"
f1()
如果下面的函数又返回值时,装饰器也必须加返回值。
四,装饰器流程剖析之参数
1,一个参数
def outer(func): #装饰器函数
def inner(a): #----->加上参数a
print("ok")
r = func(a) #----->加上参数a
print("no")
return r
return inner
@outer
def f1(args): #注意原函数有参数的时候,inter函数也必须有
print("args")
return "hello world"
f1()
注意:参数的问题
2,一个混合多个参数的问题
def outer(func): #装饰器函数
def inner(*args,**kwargs):
print("ok")
r = func(*args,**kwargs)
return r
return inner
@outer
def f1(args): #注意原函数有单个参数的时候,inter函数也必须有
print("args")
return "hello world"
@outer
def f2(*args,**kwargs): #注意原函数有多个参数的时候,inter函数也必须有
print("args,kwargs")
return "hello world"
小结:不管inner函数中传的是万能参数。至于下面引用装饰器的函数(如f1,f2...)里面有一个参
数还是多个参数,Python内部会进行自动判断,有一个参数,就传一个,有多个就传多个。
总结:上面所述都是普通的装饰器,在实际工作中多用于权限的验证。
阅读(1301) | 评论(0) | 转发(0) |