python函数装饰器构造和参数传递
作者:python老鸟 发布时间:2023-05-24 16:49:17
标签:python,函数,装饰器,构造,参数,传递
前言:
通过@语句调用一个函数去给另一个函数增加或修改一些功能的语法规则称之为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
0
投稿
猜你喜欢
- 如图输入如下命令python manage.py startapp apitest添加应用到 autotest项目项目下在settings.
- 本文通过实例为大家分享了python实现批量提取指定文件夹下同类型文件,供大家参考,具体内容如下代码import osimport shut
- [sql] -- ===================【创建存储过程】===================== USE [Message
- 实例如下:/** * 将数值四舍五入后格式化. * * @pa
- 1. 用Dreamweaver 4.0轻松设计会自动弹性调整的网页 首先需要保证的是你的页面内容采用了表格的格式,然后打开你要编辑的页面,按
- python中eval函数的用法十分的灵活,这里主要介绍一下它的原理和一些使用的场合。下面是从python的官方文档中的解释: &
- 译序:本文提到了一种很不错的实现跨浏览器圆角的解决方案,但是说的不够全面,前端观察最近将整理更多更全面的资源给大家,敬请期待。前一段时间,我
- 这个弹出层的登录界面挺好看,很清爽所以转了过来给大家分享,要实现这个功能很简单:首先设计一个登录界面,使用css中的display=&quo
- 一、在Yii中实现乐观锁乐观锁(optimistic locking)表现出大胆、务实的态度。使用乐观锁的前提是, 实际应用当中,发生冲突的
- 作为入门者来说,了解JavaScript中timer的工作方式是很重要的。通常它们的表现行为并不是那么地直观,而这是因为它们都处在一个单一线
- 下标所谓下标就是编号,就好比超市中存储柜的编号,通过这个编号就能找到相应的存储空间。Python中字符串,列表,元祖均支持下标索引。例如:#
- 之前,我介绍了学习安装并配置前端自动化工具Gulp,觉得gulp确实比grunt的配置简单很多,于是我决定再深入学习一下gulp,就去网上查
- 基本的网站页面设计元素布局比例统计,给大家做个参考,看看您的网站是否和下面的统计一致:标志图案:位置统计结果左上角84%右上角6%上方居中6
- 前言Python 以其简单易懂的语法格式与其它语言形成鲜明对比,初学者遇到最多的问题就是不按照 Python 的规则来写,即便是有编程经验的
- 短几年,Google 的 Logo 已经象 Nike 的挑勾和 NBC 的孔雀图案一样著名了。Ruth Kedar,Google
- (1)更有意义的搜索 数据可被XML唯一的标识。没有XML,搜索软件必须了解每个数据库是如何构建的。这实际上是不可能的,因为每个数据库描述数
- 示例:mysql> DELIMITER //mysql> CREATE PROCEDURE `statis`()
- <%MaxPerPage=8 ’定义页面最大的记录数为8<br>
- 这篇文章主要介绍了Python @property原理解析和用法实例,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习
- 本文实例讲述了Python实现替换文件中指定内容的方法。分享给大家供大家参考,具体如下:这里使用python编写的程序,实现如下功能:将文件