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()时,就相当于调用传入的函数。在多个装饰器的情形下,装饰器会按照从内到外的顺序依次应用,每个装饰器返回的新函数会调用上一个装饰器处理后的函数,最终调用到最初的被装饰函数。