Python函数--万能装饰器

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()

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


版权声明:本文为qq_36354559原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。