| |
|
开发:
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中的装饰器(基础装饰器) 中讲的装饰器和被装饰函数都是没有带任何参数的,在实际编程中往往有很多被装饰函数和装饰器都是带有参数的,所以了解它们的带参数情况是很有必要的。下面先从被装饰函数带参数开始,如下。 下面仍然用函数装饰器实现 :计算函数的运行时间 的功能,如下
上面就用timer装饰器实现了计算函数运行时间的功能,此时被装饰函数func是没有参数的。
此时被装饰函数func 带了一个参数num,那么装饰timer又该如何变动呢?timer的变动如下
与上面相比,这里的装饰器timer 有了些变化:decorate()函数和func()函数都多了一个形参num, 这就是当被装饰函数带有参数时装饰器的写法,装饰函数和被装饰函数也应该有对应的形参变量。 func() 添加对应的形参变量我能理解,因为它本身就是被装饰函数,但是装饰函数 decorate() 为什么也要增加形参变量呢?当时这里想了很久都没有想明白(好菜),网上搜索也没有讲的这么详细的,最后在某天就想着把它拆开一步步分析,分析过程如下
标准的装饰器timer写法是下面这样的,以应对被装饰函数func不确定的传参
二 被装饰函数有返回值当被装饰函数有返回值时,我们可以在装饰函数里面用一个变量接受,如下
上面用变量res接受func的返回值,然后return res 返回给外面用。 三 装饰器带参数对于有参数的装饰器,我们需要用两层闭包来写,如下
这里的timer比上面的timer多了一层外层函数my_timer,它的作用就是和timer构成一个闭包,然后timer和decorate构成一个闭包。 因为装饰函数decorate引用了两个自由变量:parm和func,而它的外层函数timer只能传一个func,timer自然需要外加一层函数来传parm变量,并且timer的外层函数要与timer构成闭包,以让接受的parm变量成为自由变量,从而提供给装饰函数decorate使用。 四 多个装饰器有时候一个装饰器还不能满足需求,要多个装饰器一起才能实现,多个装饰器的写法很简单,难的是理解它的执行顺序,如下
先说下多个装饰器的执行顺序:
所以上面的执行结果是
python装饰器带参数的就到此结束了,上篇文章:python中的装饰器(基础装饰器) |
|
|
上一篇文章 下一篇文章 查看所有文章 |
|
开发:
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年12日历 | -2024/12/26 3:46:20- |
|
网站联系: qq:121756557 email:121756557@qq.com IT数码 |
数据统计 |