Python函数--万能装饰器

本文深入探讨了Python中万能装饰器的实现原理,通过实例展示了如何创建能够处理任意参数的装饰器,无论是否有参数传入都能正确运行。同时,文章讲解了装饰器传参的技巧,包括如何在装饰器中使用外部传入的参数。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Python函数–万能装饰器

在之前的文章里面有说到装饰器的问题,但是只能是在不向内部函数传参的时候调用,这里还有一种万能装饰器,无论你是否传参,都能够正确运行的装饰器,以后可以直接写这个装饰器,传参之类的非常简单.

  • 万能装饰器实例
def set_fun(func):
    def call_fun(*args, **kwargs):
        print("装饰器中args参数", args)
        print("装饰器中kwargs参数", kwargs)
        return func(*args, **kwargs)  # 拆包
    return call_fun

@set_fun  # test = set_fun(test)
def test(*args, **kwargs):
    print("被装饰函数args",args)
    print("被装饰函数kwargs",kwargs)

test(123, a=123)

最后直接传参进去,123,a=123执行代码后会直接输出,对应的参数.上面需要注意的地方是用到了一个解包的方法,不知道的话,可以看下之前的文章.

如何证明这段代码是传不传参数都是可以的呢,这边,我们把test里面的参数直接删除掉,在重新运行下

验证代码

def set_fun(func):
    def call_fun(*args, **kwargs):
        print("装饰器中args参数", args)
        print("装饰器中kwargs参数", kwargs)
        return func(*args, **kwargs)  # 拆包
    return call_fun

@set_fun  # test = set_fun(test)
def test(*args, **kwargs):
    print("被装饰函数args",args)
    print("被装饰函数kwargs",kwargs)

test()
装饰器传参

但是这个地方我们出现了一个问题,我们目前是可以传参进去,并使用,但是如何传进去参数,被我们自己写的代码调用呢,

装饰器传参实例

# 装饰器传参:三个函数嵌套,最外层返回一个闭包的引用,最外层必须有参数

def set_value(name, pwd):
    def set_fun(func):
        def call_fun(*args, **kwargs):
            print("用户信息", name, pwd)
            return func(*args, **kwargs)

        return call_fun

    return set_fun


# 语法糖分成两步执行
# 1.set_value("xiaoming")当一个普通的函数进行调用,得到一个闭包的引用(闭包的外层set_fun)
# 2.@闭包的引用开始执行,@set_fun  ===> test = set_fun(test)
@set_value("xaioming", "123")
def test():
    print("test")


test()

从上面的例子中我们看到,我们又在装饰器整体函数在嵌套了一层函数,用来传参,然后传参是在语法糖调用的地方直接写上对应的参数,就能够被调用,语法糖传参的步骤解析,也在上面写出来,可以多看看这个代码

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值