不用语法糖的完整装饰器,实际上是三个函数的嵌套调用。
def send1():
print("发送消息")
def send2():
print("转账")
def outer(fun): # 装饰器函数
def inner():
print("登录...")
fun() # 执行被装饰函数
return inner
s1=outer(send1)
s1()
s2=outer(send2)
s2()
语法糖的装饰器,装饰器函数的定义没有变化,函数的调用逻辑大大简化
def outer(fun):
def inner():
print("登录...")
fun()
return inner
@outer # 不加();最好顶格写
def send():
print("发消息:很搞笑!")
send()
被装饰的函数有参数的情况,被装饰函数和装饰器内函数的参数保持一致
# 装饰函数
def outer(fun):
def inner(name): # 参数一致
print(f"{name}是inner函数中的参数")
print("哈哈")
fun(name)
return inner
@outer
def func(name): # 参数一致
print("这是被装饰的函数")
func("装饰器的内函数和被装饰函数的参数要保持一致!") # 参数一致
被装饰的函数有可变参数(*args,**kwargs)的情况,被装饰函数和装饰器内函数的参数保持一致
# 装饰函数
def outer(fun):
def inner(*args, **kwargs): # 参数一致
print(f"{args}是内函数args的参数")
print(f"{kwargs}是内函数args的参数的参数")
print("哈哈")
fun(*args, **kwargs)
return inner
@outer
def func(*args, **kwargs): # 参数一致
print("这是被装饰的函数")
print(f"{args}是被装饰函数args的参数")
print(f"{kwargs}是被装饰函数args的参数的参数")
func("args参数1", "args参数2", name="kwargs参数1", age="kwargs参数2") # 参数一致
多个装饰器的情况:离被装饰函数近的先装饰
def deco1(func):
def inner():
return "哈哈哈"+func()+"装饰器1!"
return inner
def deco2(func):
def inner():
return "nice! "+func()+" 装饰器2!"
return inner
@deco1
@deco2
def test1(): # 多个函数的装饰器,离函数近的先进行装饰
return "执行被装饰函数"
print(test1()) #输出:哈哈哈nice! 执行被装饰函数 very good!呵呵呵