广告
返回顶部
首页 > 资讯 > 后端开发 > Python >python函数装饰器构造和参数传递
  • 722
分享到

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

2024-04-02 19:04:59 722人浏览 独家记忆

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函数装饰器内容请搜索编程网以前的文章或继续浏览下面的相关文章希望大家以后多多支持编程网!

--结束END--

本文标题: python函数装饰器构造和参数传递

本文链接: https://www.lsjlt.com/news/141702.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • python函数装饰器构造和参数传递
    目录一.闭包函数二.python装饰器构造三.python装饰器叠加四.python装饰器传参1.装饰器单个参数传递2.装饰器多个参数传递3.装饰器的不定长参数五、带返回值的装饰器前...
    99+
    2022-11-13
  • Python 含参构造函数
    本篇博文主要介绍在Python3中如何构造含参构造函数 样例如下: class MyOdlHttp: username = '' password = '' def __init__(self, user...
    99+
    2023-01-31
    函数 Python
  • Python函数参数传递机制
            最近在写代码的过程中,发现Python参数传递不是很明白。Python确实很灵活,但是灵活的后果就是要花更多的时间去研究。废话不多说,始めましょう!!!Python参数传递有一下几种方式:1:位置参数Fun(arg1,arg...
    99+
    2023-01-31
    函数 机制 参数
  • Python 函数作为参数传递
    #map()的功能是将函数对象依次作用于表的每一个元素,每次作用的结果储存于返回的表re中。 #map通过读入的函数(这里是lambda函数)来操作...
    99+
    2023-01-31
    函数 参数 Python
  • Python中怎么传递函数参数
    今天就跟大家聊聊有关Python中怎么传递函数参数,可能很多人都不太了解,为了让大家更加了解,小编给大家总结了以下内容,希望大家根据这篇文章可以有所收获。函数参数的使用又有俩个方面值得注意:>>> def&nbs...
    99+
    2023-06-17
  • Python中函数参数如何传递
    这篇文章主要介绍了Python中函数参数如何传递,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。函数参数如何传递key-value方式传递参数:下面是非常常见的传递方式,参数名...
    99+
    2023-06-25
  • Python函数值传递引用传递及形式参数和实际参数的区别
    通常情况下,定义函数时都会选择有参数的函数形式,函数参数的作用是传递数据给函数,令其对接收的数据做具体的操作处理。 在使用函数时,经常会用到形式参数(简称“形参&rdqu...
    99+
    2022-11-11
  • 浅谈Python中函数的参数传递
    1.普通的参数传递 >>> def add(a,b): return a+b >>> print add(1,2) 3 >>> pri...
    99+
    2022-06-04
    浅谈 函数 参数
  • python如何传递函数中的参数
    在python中传递函数参数的方法有以下几种使用function(**kwargs)方法传参def func(**kwargs):print kwargsfunc(a = 1, b = 2, c = 3)输出为:{'a':1, 'b':2,...
    99+
    2022-10-15
  • Python中的函数参数传递问题
    目录一、前言二、了解形式参数和实际参数1.通过作用理解2.通过比喻来理解形参和实参三、位置参数1.数量必须与定义时一致2.位置必须与定义时一致四、关键字参数五、为参数设置默认值六、可...
    99+
    2023-01-04
    Python函数参数传递 Python函数 Python参数传递
  • Python函数值传递、引用传递、形式参数和实际参数的区别是什么
    本篇内容主要讲解“Python函数值传递、引用传递、形式参数和实际参数的区别是什么”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“Python函数值传递、引用传递、形式参数和实际参数的区别是什么”...
    99+
    2023-06-30
  • python函数中如何传递参数位置
    今天就跟大家聊聊有关python函数中如何传递参数位置,可能很多人都不太了解,为了让大家更加了解,小编给大家总结了以下内容,希望大家根据这篇文章可以有所收获。1、说明调用函数时,默认按位置顺序将对应的实参传递给形参,将第一个实参分配给第一个...
    99+
    2023-06-15
  • python函数的四种参数传递方式
    python中函数传递参数有四种形式 fun1(a,b,c) fun2(a=1,b=2,c=3) fun3(*args) fun4(**kargs) 四种中最常见是前两种,基本上一般点的教程都会涉及,后两种一般...
    99+
    2023-01-30
    四种 函数 参数
  • 深入理解python中函数传递参数是值传递还是引用传递
    目前网络上大部分博客的结论都是这样的: Python不允许程序员选择采用传值还是传 引用。Python参数传递采用的肯定是“传对象引用”的方式。实际上,这种方式相当于传值和传引用的一种综合。如果函数收到的是...
    99+
    2022-06-04
    函数 参数 python
  • Python 含参构造函数实例详解
    本篇博文主要介绍在Python3中如何构造含参构造函数 样例如下: class MyOdlHttp: username = '' password = '' def __init__(se...
    99+
    2022-06-04
    详解 函数 实例
  • Python函数参数传递的规则是什么
    在Python中,函数参数传递的规则如下:1. 不可变对象作为参数:当传递不可变对象(例如数字、字符串、元组)作为函数参数时,实际上...
    99+
    2023-09-16
    python
  • python函数参数传递的方法有哪些
    在Python中,函数参数传递的方法有以下几种:1. 位置参数传递:根据参数的位置顺序进行传递,参数的值与参数的位置一一对应。例如:...
    99+
    2023-10-19
    python
  • Python中函数参数传递方法有哪些
    这篇文章主要介绍“Python中函数参数传递方法有哪些”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“Python中函数参数传递方法有哪些”文章能帮助大家解决问题。定义和传递参数parameters ...
    99+
    2023-07-06
  • python 装饰器(二): 加参数
    接上篇python 闭包&装饰器(一) 一、功能函数加参数:实现一个可以接收任意数据的加法器 源代码如下: def show_time(f): def inner(*x, **y): # 形参 ...
    99+
    2023-01-30
    参数 python
  • python3--函数的有用信息,带参数的装饰器,多个装饰器装饰同一个函数
    开放封闭原则1 对扩展是开放的    为什么要对扩展开放呢?    我们说,任何一个程序,不可能在设计之初就已经想好了所有的功能并且未来不做任何更新和修改,所以我们必须允许代码扩展,添加新功能2 对修...
    99+
    2023-01-30
    函数 多个 有用
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作