python函数装饰器构造和参数传递
作者:python老鸟 时间:2023-05-24 16:49:17
前言:
通过@语句调用一个函数去给另一个函数增加或修改一些功能的语法规则称之为Python装饰器。下面通过一个小案例来简单的理解什么是装饰器。
def dog():
print('摇尾巴')
def cat():
print('喵喵喵')
call = '狗'if call == '狗':
dog()else:
cat()
这时候有一个需求,必须是猫和狗的主人呼喊它们才会做出以上动作,就需要对指令发出者进行身份验证。如果直接在判断上采用身份验证,这样代码重用度会很低,如果在上面两个函数中写,如果验证代码过多,可能需要写好几遍。这时候我们可以再创建一个函数,在调用dog
和cat
函数的时候先调用身份验证函数,但是这样,我们的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))
来源:https://blog.csdn.net/weixin_48728769/article/details/121752792
标签:python,函数,装饰器,构造,参数,传递
![](/images/zang.png)
![](/images/jiucuo.png)
猜你喜欢
图文详解在Anaconda安装Pytorch的详细步骤
2022-12-27 10:37:25
![](https://img.aspxhome.com/file/2023/8/103758_0s.png)
利用XML实现通用WEB报表打印实际使用中的例子
2008-09-04 14:42:00
Python实现京东抢秒杀功能
2021-12-06 04:50:17
![](https://img.aspxhome.com/file/2023/8/71558_0s.png)
Python 如何操作 SQLite 数据库
2024-01-24 00:09:27
SQL语句实现查询当前数据库IO等待状况
2024-01-17 02:04:32
浅谈Python魔法方法
2022-03-13 01:04:19
![](https://img.aspxhome.com/file/2023/8/130768_0s.png)
python爬虫Scrapy框架:媒体管道原理学习分析
2022-11-23 15:07:03
![](https://img.aspxhome.com/file/2023/8/87738_0s.jpg)
Python实现贪吃蛇小游戏(双人模式)
2021-06-07 11:15:02
python列表操作之extend和append的区别实例分析
2023-08-02 15:14:30
Python 处理数据的实例详解
2021-05-31 21:29:35
使用PyWeChatSpy自动回复微信拍一拍功能的实现代码
2021-08-28 21:15:07
![](https://img.aspxhome.com/file/2023/9/105079_0s.jpg)
python简单获取本机计算机名和IP地址的方法
2021-04-18 01:46:16
pycharm运行出现ImportError:No module named的解决方法
2022-09-10 18:06:23
![](https://img.aspxhome.com/file/2023/1/81861_0s.jpg)
Django添加KindEditor富文本编辑器的使用
2022-01-06 07:41:17
JavaScript中的一些实用小技巧总结
2024-04-10 10:45:15
Mysql 获取表的comment 字段操作
2024-01-19 12:12:28
![](https://img.aspxhome.com/file/2023/0/122870_0s.jpg)
浅谈numpy广播机制
2023-08-25 22:07:51
![](https://img.aspxhome.com/file/2023/4/82784_0s.jpg)
Python使用OpenCV进行标定
2022-08-17 15:05:33
![](https://img.aspxhome.com/file/2023/0/125160_0s.jpg)
JavaScript实现带自动提示的文本框效果代码
2011-02-05 11:13:00
mac下重置mysl8.0.11密码的方法
2024-01-28 06:27:50