Python:被装饰的函数,多个装饰器的装饰过程
被装饰的函数有参数:
def outer(fn):
def inner(name):
print(f"login{name}")#执行被装饰的函数
fn(name)
return inner
@outer
def send(name):
print("参数")
send('lihailu')#语法糖形式
def outer(fn):
def inner(name):
print(f"login{name}")#执行被装饰的函数
fn(name)
return inner
#@outer
def send(name):
print("参数")
#send('lihailu')
ot=outer(send)#ot=inner
ot('lihailu')#标准装饰器形式
被装饰的函数有可变函数*args,**kwargs:
def func(*args,**kwargs):
print(args)
print(kwargs)
func(name='lihailu')#普通函数
def func(*args,**kwargs):
print(args)
print(kwargs)
#func(name='lihailu')
#装饰器函数
def outer(fn):
def inner(*args,**kwargs):
print("login...")
fn(*args,**kwargs)
return inner
ot=outer(func)
ot(xixi,name="lihailu")#前者以元组的形式传递给args,后者以键等于值的形式传递给kwargs
多个装饰器:
def outer(fn):
def inner():
return "123"+fn()+"456"
return inner
def outer1(fn):
def inner():
return "789" + fn() + "000"
return inner
#被装饰的函数一
@outer
@outer1#多个装饰器的装饰过程离函数最近的装饰器先装饰,然后外面的显示器再进行装饰,由内到外的装饰过程
def test1():
return "python"
print(test1())
结果为:123789python000456#加红色的表示先装饰,就像一层糖包着一层糖
可以理解为:在装饰器函数里,fn是传入的函数对象,当调用fn()时,就相当于调用传入的函数。在多个装饰器的情形下,装饰器会按照从内到外的顺序依次应用,每个装饰器返回的新函数会调用上一个装饰器处理后的函数,最终调用到最初的被装饰函数。
