python 装饰器 传参,python装饰器原理详解
本文主要介绍python函数装饰器的结构和参数传递。下面举个小案例简单了解一下什么是装修工,需要的朋友可以参考一下。
00-1010一、关闭功能二。python装饰器构造III。python装饰覆盖图IV。python Decorator传递参数1。装饰单参数传递2。装饰器多参数传递3。装饰者的可变长度参数与带有返回值的装饰者前言:
通过@语句调用一个函数向另一个函数添加或修改某些函数的语法规则称为Python Decorator。下面是一个小案例,简单理解一下什么是装修工。
def狗():
打印(“摇尾巴”)
定义类别():
打印(“喵喵喵”)
如果call== dog 3360,则Call= dog
狗()else:
猫()
这时候就有了一个需求,猫狗的主人必须呼唤它们做上述动作,指令发出者的身份需要核实。如果直接使用认证进行判断,代码复用度会很低。如果在上面两个函数里写,验证码太多的话可能需要写几次。这时候我们可以再创建一个函数,在调用狗和猫函数的时候先调用认证函数,但是这样一来,如果我们的狗函数用在别处,不需要验证的话就会有多余的代码。以上方案各有缺点。我们可以试试前面学过的闭包函数来实现这个功能。
目录
定义函数:
定义测试():
打印(“主认证”)
f()
返回测试
def狗():
打印(“摇尾巴”)
Dog=func(Dog) #这里的dog其实就是测试函数
定义类别():
打印(“喵喵喵”)
cat=func(cat)
叫=狗
If==狗 3360
Dog() #这里的Dog函数其实就是测试函数,所以先进行认证,然后调用f()函数,也就是原来的dog()函数。这一行还可以把狗函数的名字改一下,这样比较好理解。
else:
猫()
一.闭包函数
Python提供了一种简单的编写装饰的方法,称为语法糖,
如下:
定义函数:
定义测试():
打印(“主认证”)
f()
返回测试
@func
def狗():
打印(“摇尾巴”)
# dog=func(dog)
@func
定义类别():
Print(喵喵喵)# cat=func(cat)
叫=狗
If==狗 3360
狗()
else:
猫()
功能体不变,增加额外功能,复用性高。decorator内部必须使用闭包函数,否则,当使用@时,decorator将被直接执行。注意执行顺序。
二.python装饰器构造
#装修工可以叠加使用。
定义函数:
定义测试():
打印(“主认证”)
f()
返回测试
定义功能2(f):
定义测试2():
打印(=======)
f()
返回测试2
@func2
@func #可以叠加使用decorator,先执行上面的decorator。
def狗():
打印(“摇尾巴”)
Dog() #这里的Dog函数其实是两个函数,test和test2,返回来调用上面原来的dog()函数。
三. python装饰器叠加
四.python装饰器传参
定义测试(f):
定义测试1(x):
打印(=========)
f(x)
返回测试1
@测试
定义功能1(m):
打印(m)
函数1(10)
1.装饰器单个参数传递
定义测试(f):
def test1(x,y):
打印(=========)
f(x,y)
返回测试1
@测试
定义函数2(m,n):
打印(m,n)
func2(10,5)
2.装饰器多个参数传递
定义测试(f):
def test1(*args,**kwargs):
打印(=========)
f(*args,**kwargs)
返回测试1
@测试
定义函数2(a,b,c):
# print(args,kwargs)
打印( ******** )
Func2(10,5,c=6) # C这里应该和上面Func2的第三个参数名一致。
3.装饰器的不定长参数
定义测试(f):
DEF1 (* args,* * kwargs) 3360 #这里的test1函数应该和修饰函数func2的结构一致。
打印(=========)
Res=f(*args,**kwargs) #这里相当于取修饰函数的结果并赋值。f(*args,**kwargs)的执行结果是func2的返回值。
Return #可以这样写,没有返回值,返回结果是None。
返回测试1
@测试
定义函数2(a,b,c):
# print(args,kwargs)
打印( ******** )
返回一个
print(func2(10,5,c=88))
关于python函数装饰器结构和参数传递的这篇文章到此为止。关于python function decorator的更多信息,请搜索热门IT软件开发工作室之前的文章或者继续浏览下面的相关文章。希望大家以后多多支持热门IT软件开发工作室!
郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。