脚本之家,脚本语言编程技术及教程分享平台!
分类导航

Python|VBS|Ruby|Lua|perl|VBA|Golang|PowerShell|Erlang|autoit|Dos|bat|

服务器之家 - 脚本之家 - Python - python函数装饰器构造和参数传递

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

2022-10-27 10:54python老鸟 Python

这篇文章主要介绍了python函数装饰器构造和参数传递,下面通过一个小案例来简单的理解什么是装饰器,需要的小伙伴可以参考一下

前言:

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

?
1
2
3
4
5
6
7
8
def dog():
    print('摇尾巴')
    def cat():
        print('喵喵喵')
        
call = '狗'if call == '狗':
    dog()else:
    cat()

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

一.闭包函数

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
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提供一种简单的装饰器写法,叫做语法糖,

如下:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
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装饰器叠加

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
# 装饰器可以被叠加使用
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.装饰器单个参数传递

?
1
2
3
4
5
6
7
8
9
10
11
def test(f):
    def test1(x):
        print('==========')
        f(x)
    return test1
    
@test
def func1(m):
    print(m)
    
func1(10)

2.装饰器多个参数传递

?
1
2
3
4
5
6
7
8
9
10
11
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.装饰器的不定长参数

?
1
2
3
4
5
6
7
8
9
10
11
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的第三个形参名要一致

五、带返回值的装饰器

?
1
2
3
4
5
6
7
8
9
10
11
12
13
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函数装饰器内容请搜索服务器之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持服务器之家!

原文链接:https://blog.csdn.net/weixin_48728769/article/details/121752792

延伸 · 阅读

精彩推荐
  • Pythonpython通过函数属性实现全局变量的方法

    python通过函数属性实现全局变量的方法

    这篇文章主要介绍了python通过函数属性实现全局变量的方法,实例分析了Python中函数属性的相关使用技巧,需要的朋友可以参考下 ...

    秋风秋雨4532020-06-29
  • Pythonpython检查URL是否正常访问的小技巧

    python检查URL是否正常访问的小技巧

    检查一个URL是否正常很容易,如果检查2000个URL,或者是大批量的URL怎么办?这篇文章就为大家介绍了python检查URL是否正常访问的小技巧,具有一定的参考价...

    程序猿全敏3262020-09-22
  • PythonPython图片处理之图片采样处理详解

    Python图片处理之图片采样处理详解

    这篇文章将详细为大家讲解图像采样处理,包括原理知识、代码实现和局部马赛克处理。文中的示例代码讲解详细,感兴趣的可以跟随小编一起动手试一试...

    Eastmount9952022-09-13
  • Pythonpython:print格式化输出到文件的实例

    python:print格式化输出到文件的实例

    今天小编就为大家分享一篇python:print格式化输出到文件的实例,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧...

    捉虫子的小小鸟7492021-02-21
  • Python使用Python防止SQL注入攻击的实现示例

    使用Python防止SQL注入攻击的实现示例

    这篇文章主要介绍了使用Python防止SQL注入攻击的实现示例,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋...

    似繁星跌入梦7872021-11-10
  • Pythonpandas 获取季度,月度,年度首尾日期的方法

    pandas 获取季度,月度,年度首尾日期的方法

    下面小编就为大家分享一篇pandas 获取季度,月度,年度首尾日期的方法,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧...

    u0137604538842021-01-30
  • Python用python3教你任意Html主内容提取功能

    用python3教你任意Html主内容提取功能

    这篇文章主要介绍了用python3教你任意Html主内容提取功能,主要使用到了requests、lxml、json等模块,文中逐一对这几个模块做了介绍,需要的朋友可以参考下...

    腾讯DeepOcean10812021-04-16
  • PythonPython利用memory_profiler查看内存占用情况

    Python利用memory_profiler查看内存占用情况

    memory_profiler是第三方模块,用于监视进程的内存消耗以及python程序内存消耗的逐行分析。本文将利用memory_profiler查看代码运行占用内存情况,感兴趣的可以...

    玩转测试开发4192022-06-28