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