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