python函数装饰器构造和参数传递

python函数装饰器构造和参数传递

目录

一.闭包函数

二.python装饰器构造

三.python装饰器叠加

四.python装饰器传参

1.装饰器单个参数传递

2.装饰器多个参数传递

3.装饰器的不定长参数

五、带返回值的装饰器

前言:

通过@语句调用一个函数去给另一个函数增加或修改一些功能的语法规则称之为Python装饰器。下面通过一个小案例来简单的理解什么是装饰器。

def dog():     print('摇尾巴')     def cat():         print('喵喵喵') call = '狗'if call == '狗':     dog()else:     cat()

这时候有一个需求,必须是猫和狗的主人呼喊它们才会做出以上动作,就需要对指令发出者进行身份验证。如果直接在判断上采用身份验证,这样代码重用度会很低,如果在上面两个函数中写,如果验证代码过多,可能需要写好几遍。这时候我们可以再创建一个函数,在调用dogcat函数的时候先调用身份验证函数,但是这样,我们的dog函数用在其他地方时如果不需要验证就会有冗余代码。上面几种方案都有自己的缺点,我们可以试试前面学习的闭包函数来实现这个功能。

一.闭包函数 def func(f):     def test():         print('主人身份验证')         f()     return test def dog():     print('摇尾巴') dog = func(dog) # 这里的dog其实是test函数 def cat():     print('喵喵喵') cat = func(cat) call = '狗' if call == '狗':     dog() # ★★★这里的dog函数其实是test函数,所以先执行身份验证,然后又调用f()函数,也就是原来的dog()函数,也可以给这行的dog函数换个名字,好理解★★★ else:     cat() 二.python装饰器构造

python提供一种简单的装饰器写法,叫做语法糖,

如下:

def func(f):     def test():         print('主人身份验证')         f()     return test @func def dog():     print('摇尾巴') # dog = func(dog) @func def cat():     print('喵喵喵')# cat = func(cat) call = '狗' if call == '狗':     dog() else:     cat()

函数体不发生改变,增加了额外的功能,重用性高。 装饰器内部必须使用闭包函数,否则当使用@时,装饰器就会被直接执行,注意执行顺序。

三. python装饰器叠加 # 装饰器可以被叠加使用 def func(f):     def test():         print('主人身份验证')         f()     return test def func2(f):     def test2():         print('=======')         f()  return test2 @func2 @func  # 可以叠加使用装饰器,先执行上面的装饰器 def dog():     print('摇尾巴') dog() # 这里的dog函数其实是test和test2两个函数,而test和test2又返回来调用上面的dog()原始函数 四.python装饰器传参 1.装饰器单个参数传递 def test(f):     def test1(x):         print('==========')         f(x)     return test1 @test def func1(m):     print(m) func1(10) 2.装饰器多个参数传递 def test(f):     def test1(x, y):         print('==========')         f(x, y)     return test1 @test def func2(m, n):     print(m, n) func2(10, 5) 3.装饰器的不定长参数 def test(f):     def test1(*args, **kwargs):         print('==========')         f(*args, **kwargs)     return test1 @test def func2(a, b, c):     # print(args, kwargs)     print('*********') func2(10, 5, c=6) # 这里的c和上面func2的第三个形参名要一致 五、带返回值的装饰器 def test(f):     def test1(*args, **kwargs): # 这里的test1函数要和被装饰函数func2的结构保持一致         print('==========')         res = f(*args, **kwargs) # 这里相当于把被装饰函数的结果拿过来赋值,f(*args, **kwargs)的执行结果就是func2的返回值         return res  # 没有返回值也可以这样写,返回结果就是None     return test1 @test def func2(a, b, c):     # print(args, kwargs)     print('*********')     return a + b + c print(func2(10, 5, c=88))

到此这篇关于python函数装饰器构造和参数传递的文章就介绍到这了,更多相关python函数装饰器内容请搜索易知道(ezd.cc)以前的文章或继续浏览下面的相关文章希望大家以后多多支持易知道(ezd.cc)!

推荐阅读

    excel怎么用乘法函数

    excel怎么用乘法函数,乘法,函数,哪个,excel乘法函数怎么用?1、首先用鼠标选中要计算的单元格。2、然后选中单元格后点击左上方工具栏的fx公

    opporeno8参数配置及价格

    opporeno8参数配置及价格,面部,亿元,Oppo的荣誉2020年1月4日,接近屏幕关闭传感器是否支持双卡:支持oppor11splus什么时候上市的Oppo R11S P

    wps如何修改页眉上边距

    wps如何修改页眉上边距,WPS教程,1.WPS版word怎样设置页眉边距WPS中word设置页眉边距技巧“页边距”:页面上打印区域之外的空白空间。1、设

    excel中乘法函数是什么?

    excel中乘法函数是什么?,乘法,函数,什么,打开表格,在C1单元格中输入“=A1*B1”乘法公式。以此类推到多个单元。1、A1*B1=C1的Excel乘法公式

    魅蓝note6性能参数有哪些

    魅蓝note6性能参数有哪些,摄像头,蓝牙,魅蓝note6性能参数有哪些魅力蓝色Note6最好拍照。电池寿命更长。蓝色Note6使用高通 snapdragon 625

    标准差excel用什么函数?

    标准差excel用什么函数?,函数,标准,什么,在数据单元格的下方输入l标准差公式函数公式“=STDEVPA(C2:C6)”。按下回车,求出标准公差值。详细