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