IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> Python知识库 -> python 修饰器 -> 正文阅读

[Python知识库]python 修饰器

作用

简单的说,python修饰器就是可以对函数参数以及返回结果进行操作。

如果已经懂了函数闭包的朋友相信已经大概知道该怎么做了,还有不懂的朋友可以看我的这篇文章——python闭包简记。

理解修饰器

我用一个求取平均分的简单案例来说明修饰器的具体用法。

# 装饰器
def check(func):  # 这里传入要处理的函数名
    def realCheck(**kwargs):  # 这里会获取传入的所有关键字参数,kwargs={'python': 48, 'c': 89, 'java': 86}
        """
        这里可以对传入的参数进行操作
        """
        avg = func(**kwargs)  # 调用函数方法,相当于执行了avgScoe函数
        """
        这里对生成的结果进行操作
        """
        return avg            # 最后将结果返回  
    return realCheck          # 闭包函数经典特征,以内函数作为返回结果
 
 
def avgScore(python,c,java):   # 定义一个求平均值的方法
    return (python+c+java) / 3

score = check(avgScore)  # 手动修饰器 

print(score(python=48,c=89,java=86))  # 输出结果,注意在这里传入参数

#  print(check(avgScore)(python=48,c=89,java=86))  # 当然也能够一气呵成,两步化作一步。


上面代码已经将使用修饰器功能的雏形给打造出来了。也许有同学会问:平常我见到的修饰器不是用 @修饰器名 写在被修饰函数前面的吗?没错确实是,上面写法是另一种形式,我想那种写法应该是修饰器最原本的写法吧!

平时见到的应该是这种写法。

# 装饰器
def check(func):  # 这里传入要处理的函数名
    def realCheck(**kwargs):  # 这里会获取传入的所有关键字参数,,kwargs={'python': 48, 'c': 
        print(kwargs)
        """
        这里可以对传入的参数进行操作
        """
        avg = func(**kwargs)  # 调用函数方法,相当于执行了avgScoe函数
        """
        这里对生成的结果进行操作
        """
        return avg            # 最后将结果返回  
    return realCheck          # 闭包函数经典特征,以内函数作为返回结果
 
@check  # 注意没有空格
def avgScore(python,c,java):   # 定义一个求平均值的方法
    return (python+c+java) / 3

print(avgScore(python=48,c=89,java=86))  # 输出结果



ok,我们现在分析一下这部分代码,在check函数中,它需要传入一个函数作为他的参数,然后以内函数(realCheck)作为返回值,执行内函数。说白了check函数的功能仅仅是用来接收avgScore函数,营造环境供realCheck使用而已。当然,check函数里面除了定义realCheck函数也可以定义其他的变量方法等,因为这个案例比较简单,定义realCheck函数即可。在 realCheck 函数中需要接收传递过来的参数,参数与avgScore函数中的参数相对应,因为本来就是修饰它的。接着就是进行相应的逻辑处理了。

最后的难点就在于如何写明修饰器。如果理解了就觉得简单,没理解就觉得很绕。看看能不能理解这句话:就是向 修饰器函数 传入需要 被 修饰的函数,然后还需要一个括号将参数传递进去。 就能实现修饰器函数的功能了。

修饰器的使用

理解完修饰器的大概流程后我们就看看如何去使用它。回想一下修饰器要用来干啥?修饰器的出现就是为了能够更加完善函数,提升代码质量。

看一下上面的代码,有什么问题?没错,python分数太低了,我们学python这么认真怎么可能这么低分?? 修改一波!

# 装饰器
def check(func):  # 这里传入要处理的函数名
    def realCheck(**kwargs):  # 这里会获取传入的所有关键字参数,,kwargs={'python': 48, 'c':
        if kwargs["python"] < 95:  
            kwargs["python"] = 100
        avg = func(**kwargs)  # 调用函数方法,相当于执行了avgScoe函数
        """
        这里对生成的结果进行操作
        """
        return avg            # 最后将结果返回  
    return realCheck          # 闭包函数经典特征,以内函数作为返回结果

我们对传入的参数进行一个判断,如果python分数低于95分,那么就让他等于100分。其实这个过程就印证了开头说的,修饰器能够对参数进行处理。

接着再来看看有什么问题?如果能够复制代码执行一遍就知道有什么问题了。没错!
在这里插入图片描述
我们没有处理小数。算个分数怎么可能有这么多小数的?所以我们还需要进行处理。

# 装饰器
def check(func):  # 这里传入要处理的函数名
    def realCheck(**kwargs):  # 这里会获取传入的所有关键字参数,,kwargs={'python': 48, 'c':
        if kwargs["python"] < 95:
            kwargs["python"] = 100
        avg = func(**kwargs)  # 调用函数方法,相当于执行了avgScoe函数

        s = int(avg)+0.5
        avg = s if avg > s else int(avg)
        
        return avg            # 最后将结果返回  
    return realCheck          # 闭包函数经典特征,以内函数作为返回结果
 
@check  # 注意没有空格
def avgScore(python,c,java):   # 定义一个求平均值的方法
    return (python+c+java) / 3

print(avgScore(python=48,c=89,java=86))  # 输出结果

我们对结果进行处理,如果这个分数的小数部分大于等于0.5那就让他小数部分为0.5,否则不要小数。举个例子,如果是91.666 那么结果就是91.5 如果是91.333 那么结果就是91。这一步就印证了开头所说的能够对返回结果进行处理。

至此,修饰器的基本使用我已经讲解完了,如果有对某一步有疑惑的同学可以在下方留言,我会一一回复。

  Python知识库 最新文章
Python中String模块
【Python】 14-CVS文件操作
python的panda库读写文件
使用Nordic的nrf52840实现蓝牙DFU过程
【Python学习记录】numpy数组用法整理
Python学习笔记
python字符串和列表
python如何从txt文件中解析出有效的数据
Python编程从入门到实践自学/3.1-3.2
python变量
上一篇文章      下一篇文章      查看所有文章
加:2022-06-20 22:59:42  更:2022-06-20 23:00:00 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年5日历 -2024/5/18 15:23:37-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码