iis服务器助手广告广告
返回顶部
首页 > 资讯 > 后端开发 > Python >如何进行Python函数装饰器的使用
  • 612
分享到

如何进行Python函数装饰器的使用

2023-06-26 06:06:30 612人浏览 泡泡鱼

Python 官方文档:入门教程 => 点击学习

摘要

如何进行python函数装饰器的使用,针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。装饰器装饰器的定义关于装饰器的定义,我们先来看一段github上大佬的定义:Functio

如何进行python函数装饰器的使用,针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。

    装饰器

    装饰器的定义

    关于装饰器的定义,我们先来看一段github上大佬的定义:

    Function decorators are simply wrappers to existing functions.
    In the context of design patterns,decorators dynamically alter the functionality of a function, method or class without having to directly use subclasses.
    This is ideal when you need to extend the functionality of functions that you don’t want to modify.
    We can implement the decorator pattern anywhere, but Python facilitates the implementation by providing much more expressive features and syntax for that.

    这段话的最主要的意思就是:

    函数装饰器是给已有函数的简单容器
    在原有的代码环境下,它能够动态地改变一个函数的功能,或者不直接使用子类而改变方法和类。
    当你不想修改源代码但又想实现功能上的扩充的时候,这是一个不错的方法。
    我们可以在任何情况下使用装饰器样式,同时Python通过提供更多强力的属性和语法来帮助装饰器的使用。

    装饰器的意义

    在上文之中其实我们已经知道了装饰器的意义,
    可以不需要修改源代码就能够直接做到功能的扩充,但是为此我们需要付出的是更多的编写时间,
    而且更为重要的是,通过修改源码实现功能的增加往往会改变接口传递的参数,可一个项目之中往往存在许多接口这也代表着你可能需要多次更改接口参数,
    这个工作量,我们可不干!

    装饰器的使用

    无参装饰器

    无参装饰器是最为基础的装饰器,
    其根本原因在于装饰的函数对象不需要仍和的参数;
    接下来示范一下最简单的装饰器是如何实现的:

    def greeting():# 定义一个最基本的无参函数    return "Hello,读者老爷们!"# 现在我需要实现的要求是:让输出的内容变为<p>"Hello,读者老爷们"<p># 在不直接更改greeting函数的前提下,我们需要使用无参装饰器def decorator_p(func):# 用于接收一个函数def wrapper():return f'<p>{func()}<p>'return wrapperdecorator = decorator_p(greeting)# 调用decorator_p,并且用一个decorator接收返回值print(decorator())

    <p>Hello,读者老爷们!<p>
    以上就是输出的结果

    但是这个结果我其实并不满意,
    因为完成了功能附加之后我们居然还需要再使用decorator = decorator_p(greeting)来接收一下,而且这样的话调用方式就不再是原本的greeting()了,而是decorator()
    这两者对于追求高效优雅的Python来说已经提供解决方法了,
    让我娓娓道来:

    # 针对于调用方式而言,我们首先想到的解决方法是greeting = decorator_p(greeting)# 将原本的greeting函数传给decorator_p,而重命名print(greeting())# 输出结果与原来相同
    但这个仍然可以改进,这就要使用到Python提供的@,但使用这种方法必须注意书写的顺序,因此代码必须这样更改:
    def decorator_p(func):    def wrapper():        return f'<p>{func()}<p>'    return wrapper@decorator_p# 效果等同于 greeting = decorator_p(greeting)def greeting():    return "Hello,读者老爷们!"print(greeting())

    <p>Hello,读者老爷们!<p>

    得到的结果是我们想要的,但使用这种方法顺序格外重要,
    如果这样书写,则会给出报错:

    @decorator_p#使用这个@后,将会开始向上寻找decorator_p这个函数def greeting():    return "Hello,读者老爷们!"print(greeting())def decorator_p(func):    def wrapper():        return f'<p>{func()}<p>'    return wrapper

    NameError: name &lsquo;decorator_p&rsquo; is not defined

    给出的报错原因是因为没有找到decorator_p这个函数,
    可明明我们已经完成这个函数的定义了,
    所以我们可以得到的结论便是:

    当使用@时,就会开始向上寻找函数,当找不到函数的时候就会报错

    有参装饰器

    接下来介绍一下有参装饰器,就是指需要传递参数的装饰器,
    上文之中其实已经介绍过了关于无参装饰器的使用,而有参装饰器也并没有多难,
    来一个示范:

    def decorator(func):    def wrapper(name):        return f'<p>{func(name)}<p>'     return wrapper@decoratordef greeting(name):    return f"Hello,{name}!"print(greeting('读者老爷'))# 传递一个参数

    <p>Hello,读者老爷!<p>

    实例练习

    OK,经过上文介绍所有读者应该又会处于似懂非懂的状态,
    那么秉持一文一练的理念,我们接下来将通过编写登录功能,仔细看一下使用装饰器和不适用装饰器的区别。
    在开始之前,我创建了一个文本文件夹,将会用于模拟用户储存的信息,内容如下:

    sign_in.txtJoseph:JostarJonasen:JostarKujo:JotaroJolin:KujoDiavollo:Doppio

    需求清单:
    1)用户账户只能够由数字和英文组成,长度不超过16字符;
    2)用户密码只能够由数字和英文组成,长度不超过16字符;
    3)用户拥有4次输入的机会。

    # 不使用任何函数# 无装饰器 登录功能count = 1# 用于计算使用次数while count < 5:    user_account = input('请输入你的账号')    if user_account.isalnum() and len(user_account) <= 16:# 判断账号长度和组成        user_keyWord = input('请输入你的密码')        if user_keyword.isalnum() and len(user_keyword) <= 16:# 判断密码的长度和组成            with open('sign_in.txt','r') as file:# 打开登录文件核对登录信息                for line in file:                    r_name, r_keyword = line.strip().split(':')                    if r_name == user_account and r_keyword == user_keyword:                        print('登录成功')                        break                else:                    count += 1                    print(f'账号密码不匹配,还剩下{5-count}次机会')                    continue                break        else:            count += 1            print(f'密码输入错误,还剩下{5-count}次机会')            continue    else:        count += 1        print(f'输入账号错误,还剩下{5-count}次机会')        continueelse:    print('机会已用完')

    程序员之间总是流传着这么一个梗,
    开发总是会看着一串代码愣愣出神说道:“这究竟是谁写的代码,像坨屎。”
    然后过了良久突然说“好像是我自己写的。”

    接下来我们需要做的就是改良,使用装饰器将其改良,
    我们的源代码将其固定成这样:

    # 只是单纯的用户输入,# 而后我们要在此基础上不断优化,为其添加上判断长度、限制次数的功能def input_signup():    user_name = input('请输入账户名字')    user_keyword = input('请输入账户密码')    return user_name, user_keyword
    def passing_func(func1, func2, func3):    def wrapper(func4):        def decorator():            count = 1            while count < 5:                name, keyword = func4()                check = func1(name, keyword)                if check is not True:                    count += 1                    print(f'你还剩下{5-count}次登录机会')                    continue                check = func2(name, keyword)                if check is not True:                    count += 1                    print(f'你还剩下{5-count}次登录机会')                    continue                check = func3(name, keyword)                if check is not True:                    count += 1                    print(f'你还剩下{5 - count}次登录机会')                    continue                else:                    break        return decorator    return wrapperdef limit_len(name, keyword, length=16):    '''    用于判断用户名字和密码的长度是否符合标准    :param   name:用于接受用户的名字    :param   keyword:用于接受用户的密码    :param   length:默认参数为16    :return: check:用于判断输入是否符合长度标准,详细请见装饰器中的使用    '''    check = True    if len(name) > length or len(keyword) > length:        print('账号名或密码长度不符合规范')        check = False        return check    return checkdef limit_composition(name, keyword):    '''    用于判断用户名字和密码的组成是否符合标准    :param   name:用于接受用户的名字    :param   keyword:用于接受用户的密码    :return: check:用于判断输入是否符合长度标准,详细请见装饰器中的使用    '''    check = True    if name.isalnum() is not True or keyword.isalnum() is not True:        print('账号名或密码组成不符合规范')        check = False        return check    return checkdef verify_useinfo(name, keyword):    '''    用于检验用户输入的账号和密码是否符合文件中储存的    :param   name:用于接受用户的名字    :param   keyword:用于接受用户的密码    :return: check:用于判断输入是否符合长度标准,详细请见装饰器中的使用    '''    check = True    with open('sign_in.txt','r') as file:        for line in file:            r_name, r_keyword = line.strip().split(':')            if r_name == name and r_keyword == keyword:                print('登录成功,欢迎使用')                return check        else:            check = False            print('账号密码错误,请重新输入')            return check@passing_func(limit_len, limit_composition, verify_useinfo)def input_signup():    user_name = input('请输入账户名字')    user_keyword = input('请输入账户密码')    return user_name, user_keyword

    关于如何进行Python函数装饰器的使用问题的解答就分享到这里了,希望以上内容可以对大家有一定的帮助,如果你还有很多疑惑没有解开,可以关注编程网Python频道了解更多相关知识。

    --结束END--

    本文标题: 如何进行Python函数装饰器的使用

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

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

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

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

    下载Word文档
    猜你喜欢
    • 如何进行Python函数装饰器的使用
      如何进行Python函数装饰器的使用,针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。装饰器装饰器的定义关于装饰器的定义,我们先来看一段github上大佬的定义:Functio...
      99+
      2023-06-26
    • 如何使用Python装饰器修改函数行为
      这篇文章主要介绍了如何使用Python装饰器修改函数行为的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇如何使用Python装饰器修改函数行为文章都会有所收获,下面我们一起来看看吧。Python 中的装饰器是什么...
      99+
      2023-06-29
    • 如何使用Python中的装饰器函数
      如何使用Python中的装饰器函数在Python编程中,装饰器(decorators)是一种非常有用的工具。它允许我们在不修改原始函数代码的情况下,对函数进行额外的功能扩展。装饰器函数可以在函数执行前后自动执行一些操作,例如记录日志、计时、...
      99+
      2023-10-22
      Python 使用 装饰器函数
    • Python中怎么使用装饰器装饰函数
      这篇文章将为大家详细讲解有关Python中怎么使用装饰器装饰函数,文章内容质量较高,因此小编分享给大家做个参考,希望大家阅读完这篇文章后对相关知识有一定的了解。***个函数deco是装饰函数,它的参数就是被装饰的函数对象。我们可以在deco...
      99+
      2023-06-17
    • python如何使用装饰器缓存函数调用
      这篇文章给大家分享的是有关python如何使用装饰器缓存函数调用的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。使用装饰器缓存函数调用你是否曾经编写过一种函数,它执行昂贵的 I/O...
      99+
      2024-04-02
    • Python中怎么使用装饰器来装饰函数
      在Python中,装饰器是一种函数,它接受一个函数作为参数,并返回一个新的函数。通过使用装饰器,可以在不修改原始函数代码的情况下添加...
      99+
      2024-03-12
      Python
    • Python函数装饰器的使用详解
      目录装饰器装饰器的定义装饰器的意义装饰器的使用无参装饰器有参装饰器实例练习总结装饰器 装饰器的定义 关于装饰器的定义,我们先来看一段github上大佬的定义: Function de...
      99+
      2024-04-02
    • Python装饰器函数怎么使用
      这篇文章主要介绍了Python装饰器函数怎么使用的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇Python装饰器函数怎么使用文章都会有所收获,下面我们一起来看看吧。假如我写了一个函数 fdef f()...
      99+
      2023-07-02
    • python如何用使用装饰器统计函数的耗时
      小编给大家分享一下python如何用使用装饰器统计函数的耗时,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!装饰器装饰器是一个装饰函数的函数,能够在不改变函数源码和...
      99+
      2023-06-17
    • Python函数的装饰器
      函数的装饰器. 1. 装饰器   开闭原则:         对功能的扩展开放         对代码的修改是封闭     通用装饰器语法: def wrapper(fn): def inner(*args, **kw...
      99+
      2023-01-30
      函数 Python
    • 如何使用Python的装饰器
      这篇文章将为大家详细讲解有关如何使用Python的装饰器,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。1.定义及使用例1:装饰器定义:      def 装饰器函数(外部函数...
      99+
      2023-06-29
    • python装饰器1:函数装饰器详解
      装饰器1:函数装饰器 装饰器2:类装饰器 装饰器3:进阶 先混个眼熟 谁可以作为装饰器(可以将谁编写成装饰器): 函数 方法 实现了__call__的可调用类 装饰器可以去装饰谁(谁可以被装饰): 函数 方法 类 基础...
      99+
      2023-01-30
      详解 函数 python
    • Python装饰器-闭包与函数装饰器
      一、闭包在学习装饰器前,需要先了解闭包的概念。形成闭包的要点:函数嵌套将内部函数作为外部函数的返回值内部函数必须要使用到外部函数的变量下面以一个计算列表平均值的案例来讲解闭包:def make_average(): # 创建一个列表,用来保...
      99+
      2023-05-14
      Python 函数 装饰器
    • python之装饰器(函数)
      1. 装饰器   遵循的原则:     开闭原则:   对功能的扩展开放  对代码的修改是封闭 # 通用装饰器写法 # 存在的意义: 在不破坏原有函数和原有函数调用的基础上,给函数添加新的功能. def wrapper...
      99+
      2023-01-30
      函数 python
    • 怎么在python中使用函数装饰器
      怎么在python中使用函数装饰器?很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。Python主要用来做什么Python主要应用于:1、Web开发;2、数据科学研...
      99+
      2023-06-14
    • Python中如何使用装饰器?
      类方法和静态方法有点相似,他们都推荐使用类来调用(其实也可以使用对象来调用) 定义类方法 —使用@classmetho修饰(函数装饰器) —方法的第一个参数定义为cls(class的缩写),用类调用该方法时该参数会自动绑定 定义静...
      99+
      2023-01-31
      如何使用 Python
    • 如何使用Python装饰器Decorator
      本篇内容介绍了“如何使用Python装饰器Decorator”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成! 1. 叠加使用Pyth...
      99+
      2023-06-15
    • Python 函数装饰器怎么用
      这篇文章主要介绍Python 函数装饰器怎么用,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!一、什么是函数装饰器函数装饰器是Python提供的一种增强函数功能的标记函数;装饰器是可调用的函数对象,其参数是另...
      99+
      2023-06-21
    • 如何进行Python各种类型装饰器的分析
      这篇文章将为大家详细讲解有关如何进行Python各种类型装饰器的分析,文章内容质量较高,因此小编分享给大家做个参考,希望大家阅读完这篇文章后对相关知识有一定的了解。装饰器说明Python中的装饰器是一种可以装饰其它对象的工具。该工具本质上是...
      99+
      2023-06-22
    • Python函数装饰器应用教程
      目录一、什么是函数装饰器二、函数装饰器的执行时机三、变量作用域四、闭包五、保留函数的元数据七、使用lru_cache缓存函数执行结果八、使用singledispatch实现泛型函数九...
      99+
      2024-04-02
    软考高级职称资格查询
    编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
    • 官方手机版

    • 微信公众号

    • 商务合作