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


猜你喜欢
- 前言本文主要给大家介绍了关于python中用Future对象回调别的函数的相关内容,分享出来供大家参考学习,下面话不多说了,来一起看看详细的
- 目录1、请求模块:urllib.requestdata参数:post请求urlopen()中的参数timeout:设置请求超时时间:响应类型
- 本篇资料来于官方文档:http://cn.vuejs.org/guide/components.html#Props本文是在官方文档的基础上
- 关于python的ssh库操作需要引入一个远程控制的模块——paramiko,可用于对远程服务器进行
- 简介pandas中的DF数据类型可以像数据库表格一样进行groupby操作。通常来说groupby操作可以分为三部分:分割数据,应用变换和和
- 一、xajax与其它ajax框架的比较 xajax功能很简单,但很灵活!~它不象其它一些大的框架,功能确实强大,但执行速度不敢恭维。。功能虽
- 一、愉客行车程监控并通知大概思路:用户填写指定信息在config.json文件中,通过定时访问网页,获取指定信息,从而达到对指定车程的监控1
- 什么是1433端口 1433端口,是SQL Server默认的端口,SQL Server服务使用两个端口:TCP-1433、UDP-1434
- 今天,发现了一个之前从未注意的角落,相信能够大大提高自己写JS的速度。能够迅速发现错误。例如,今天的加班中调试一个js错误发现的一个例子。1
- 俺比较笨,对太专业的书一直不感冒,看了就想睡觉。最近李明同学传了本“大话设计模式”电子版。偶然翻了翻,感觉还满通俗的,正适合我这样的懒人学习
- 计算矩阵标准差>>> a = np.array([[1, 2], [3, 4]])>>> np.std(
- 一、前言MySQL 的锁按照范围可以分为全局锁、表锁、行锁,其中行锁是由数据库引擎实现的,并不是所有的引擎都提供行锁,MyISAM 就不支持
- 闭包(closure)是函数式编程的重要的语法结构。函数式编程是一种编程范式 (而面向过程编程和面向对象编程也都是编程范式)。在面向过程编程
- MySQL8数据库安装一、Windows 环境下安装A、下载 MySQL下载地址Select Operating System:Micros
- 近几天闲着没事开始学了些python,看了看之前写过的代码,把写过的基础的几个程序写进博客,今天是第一个。一个可以说简单的不能再简单的小程序
- 本文实例讲述了js实现div弹出层的方法。分享给大家供大家参考。具体分析如下:话说现在各种插件出来了要实现弹出层真是太简单了,但个人有时觉得
- 前言针对使用MySQL的索引,我们之前介绍过索引的最左前缀规则,索引覆盖,唯一索引和普通索引的使用以及优化器选择索引等概念,今天我们讨论下如
- 1.乘法和幂运算符● 单个 * 用于乘法运算● 两个 ** 表示幂运算>>> 2*3>>> 6>&
- 人脸检测方法有许多,比如opencv自带的人脸Haar特征分类器和dlib人脸检测方法等。对于opencv的人脸检测方法,有点是简单,快速;
- ------谁正在访问数据库?Select c.sid, c.serial#,c.username,a.object_id,b.