python基础——装饰器(2)

不用语法糖的完整装饰器,实际上是三个函数的嵌套调用。

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!呵呵呵
posted @ 2026-04-21 11:42  MyEngine  阅读(4)  评论(0)    收藏  举报