银河国际点击登录:python装饰器理解,python装饰理解

 

python装饰器掌握,python装饰驾驭

 

1.装饰器的功能

在不更换棉被服装饰对象的源代码以及调用方式的前提下为被点缀对象增多新职能

原则:

1.不修改被装饰对象的源代码
2.不修改被装饰对象的调用方式

目标:

为被装饰对象添加新功能

2.装饰器的概念和运用

来看下边包车型客车代码:

银河国际点击登录 1

index函数的成效是程序在随机睡眠1到5秒今后,打字与印刷一句话

今日想为index函数增添叁个新职能:总计index函数的运维时刻,该怎么做吧??

修改index函数如下:

银河国际点击登录 2

运作程序,实行结果如下:

welcome to index page
cost time: 2.000999927520752

能够看来,为index函数增多新职能实在达成了,不过却反其道而行之了开放密封原则。

在符合开放密闭原则的前提下,假若想为index函数增添新职能,此时就要动用装饰器了

修改代码

银河国际点击登录 3

运行程序,查看实施结果

welcome to index page
run time: 1.0

从程序推行结果能够看到,index函数的运行时刻已经被计算出来了

然则查看源码能够了然,index函数的源码确实未有被修改,可是index的调用格局被改造了

再正是还会有叁个难题不怕,timmer那几个装饰器只可以被用来装饰index那么些函数,如若之后想总括别的函数的周转时刻,又要再度定义其余装饰器,那样也太不灵活了。

修改上边的代码

银河国际点击登录 4

运转程序,查看程序推行结果

welcome to index page
run time: 4.0

可以看来,index函数的源代码未有被修改,index函数的调用方式也从不变,不过依旧为index函数增多了总括时间的职能,这里运用的正是装饰器了。

来剖析下方面代码的实施流程:

银河国际点击登录 5

这正是装饰器装饰index函数的施行流程

3.装饰器的简化使用

近期自家又有别的三个函数home,今后本人也想总计home函数的运营时刻,可以把代码修改如下

银河国际点击登录 6

运作程序,实行结果如下

welcome to index pagerun time: 3.0
welcome to home pagerun time: 4.0

能够看看,每回调用计算程序运维时间的装饰器timmer,都要先把被调用的函数的函数名作为参数字传送给timmer装饰器

然后再把timmer装饰器的奉行结果赋值给被调用的函数名本身,最后工夫调用棉被服装饰的函数,太难为了有未有??

实在python中的装饰器能够简化成下边包车型大巴格式

银河国际点击登录 7

程序试行结果

welcome to index pagerun time: 2.0
welcome to home pagerun time: 4.0

能够见见,使用 @加装饰器名添加到被装饰对象的上方的点子也足认为一个函数加多装饰器中定义的效果

4.七个装饰器的概念与调用

在地点的例证里,定义并调用了三个计算程序运维时间的装饰器timmer,

假诺今后想为index函数增加二个客户认证的功效,能够定义四个名字为auth的装饰器

银河国际点击登录 8

运营程序

银河国际点击登录 9

从程序实施结果可以看到,客商登入密码验证的装饰器auth已经定义并被成功调用了

万一想为index函数增加客商认证的意义,又想计算index函数实施时间的法力,在动用装饰器的情事下该怎么调用呢

银河国际点击登录 10

在地方的代码里,为index函数增加了多少个装饰器,未来有多少个主题素材,正是那多少个装饰器毕竟哪位先被调用,哪个后被调用呢??

来分析一下,

如果timmer装饰器先被调用,那么程序就会先执行timmer装饰器,然后再执行auth装饰器,提示输入用户名和密码,
这样一来timmer装饰器统计的时间就会包括输入用户名和密码的时间,这个时间会远远大于index函数睡眠的2秒种;
如果auth装饰器先被调用,timmer装饰器后被调用,那么timmer装饰器统计的运行时间就应该只包括index函数的执行时间值应该在2秒多一点点的时间范围内

运营程序,先输入错误的客户名和密码以利用程序的施行时间加长

银河国际点击登录 11

从程序的实行结果能够理解,程序是先运营timmer装饰器,然后才运转auth装饰器,所以timmer总计的时刻就总结了顾客认证的时日,所以timmer总计到的程序运维时间远远出乎index睡眠的2分钟

据此那边得出三个定论:

当一个函数同时被两个装饰器装饰时,加上函数最上面的装饰器先执行,加在下面的装饰器先装饰

把地点例子里的timmer装饰器和auth装饰器地方交换一下

银河国际点击登录 12

运营index函数,依然先输入错误的客户名和密码,增加客户认证的时日

银河国际点击登录 13

能够看出,这一次timmer总结到的年华只包括index函数的运作时刻,不分包客户张开认证的大运

来剖析一下地点例子中,index函数被timmer装饰器和auth装饰器装饰的代码装饰流程

银河国际点击登录 14

在地点得出结论,叁个函数同期被多少个装饰器时,加在下边包车型地铁装饰器先装饰

1.timmer装饰器装饰原始的index,可以写成:index=timmer(index)2.在timmer装饰器中,timmer装饰器实际上是返回inner的内存地址,所以在这里,index=inner3.timmer装饰器装饰完成后,由auth装饰器来装饰,此时可以写成index=auth(index),4.这里auth括号里的index已经不再是原始index函数,而是已经被timmer装饰过后的index了,所以index=auth(timmer(index))5.又因为timmer装饰的结果等于inner函数的内存地址,所以:index=auth(inner)

迄今,五个装饰器的装点进度已经知道了,来看程序的实践进程

银河国际点击登录 15

所以那边客户输入顾客名和密码的时刻不会被timmer装饰器总括在内

5.棉被服装饰函数参数的设置与概念

先来看一段代码

银河国际点击登录 16

如上所示,home函数增多了叁个参数,而index函数并从未参数

遵从正规的函数的概念与调用方式,调用index函数和home函数的点子应该是下边这种情势

index()home("python")

下一场大家运维程序就能开掘,程序抛出了足够

银河国际点击登录 17

说个拾壹分表明inner函数无需地方参数,不过我们给了叁个职位参数

归来timmer装饰器定义的局地,能够看到,timmer装饰器的在那之中等高校函授数确实未有概念参数

这样一来,timmer装饰器只好用来装饰未有参数的函数了,

小编们得以在timmer装饰器定义的时候为inner函数增加三个参数

银河国际点击登录 18

而是那样一来,timmer装饰器装饰index函数的时候又会抛出十分,因为index函数未有参数

File "E:\python_learn\py_code\test.py", line 27, in <module>index()
TypeError: inner() missing 1 required positional argument: 'name'

在不了解被点缀函数的参数个数的气象下,即棉被服装饰函数的参数可变长,且格局不定点的时候,

银河国际点击登录 19

银河国际点击登录 20

银河国际点击登录 21

银河国际点击登录 22

银河国际点击登录 23

银河国际点击登录 24

1.装饰器的作用在不修改被点缀对象的源代码以及调用格局的前提下为棉被服装饰对象增加新功用原则: 1.不…

1.装饰器的功效

在不变棉被服装饰对象的源代码以及调用情势的前提下为被点缀对象增多新作用

原则:

1.不修改被装饰对象的源代码
2.不修改被装饰对象的调用方式

目标:

为被装饰对象添加新功能

2.装饰器的概念和采纳

来看下边包车型大巴代码:

银河国际点击登录 1

index函数的效能是程序在任意睡眠1到5秒未来,打字与印刷一句话

这两天想为index函数加多一个新效用:总结index函数的运转时刻,该如何做吧??

修改index函数如下:

银河国际点击登录 2

运维程序,实践结果如下:

welcome to index page
cost time: 2.000999927520752

能够看到,为index函数添加新成效实在达成了,不过却迥然差别了开放密闭原则。

在符合开放密闭原则的前提下,倘诺想为index函数增加新成效,此时就要动用装饰器了

修改代码

银河国际点击登录 3

运作程序,查看施行结果

welcome to index page
run time: 1.0

从程序实行结果能够看到,index函数的周转时刻已经被总括出来了

而是查看源码能够领会,index函数的源码确实尚未被改变,可是index的调用格局被涂改了

与此同一时候还应该有二个主题材料尽管,timmer那几个装饰器只可以被用来装点index这些函数,要是现在想总计其他函数的运作时刻,又要双重定义其余装饰器,那样也太不利索了。

修改上边的代码

银河国际点击登录 4

运作程序,查看程序实施结果

welcome to index page
run time: 4.0

能够看到,index函数的源代码没有被改造,index函数的调用方式也尚未改观,不过依旧为index函数增添了总括时间的功用,这里运用的正是装饰器了。

来剖判下方面代码的施行流程:

银河国际点击登录 5

那就是装饰器装饰index函数的施行流程

3.装饰器的简化使用

今昔自己又有另外一个函数home,今后自作者也想计算home函数的周转时刻,能够把代码修改如下

银河国际点击登录 6

运行程序,试行结果如下

welcome to index pagerun time: 3.0
welcome to home pagerun time: 4.0

能够看来,每趟调用总括程序运转时间的装饰器timmer,都要先把被调用的函数的函数名作为参数字传送给timmer装饰器

下一场再把timmer装饰器的试行结果赋值给被调用的函数名本人,最终技能调用被点缀的函数,太辛勤了有未有??

其实python中的装饰器能够简化成上面包车型客车格式

银河国际点击登录 7

程序施行结果

welcome to index pagerun time: 2.0
welcome to home pagerun time: 4.0

能够看看,使用 @加装饰器名添加到被装饰对象的上方的章程也可感觉四个函数增加装饰器中定义的效劳

4.五个装饰器的概念与调用

在下边包车型大巴事例里,定义并调用了一个总结程序运营时间的装饰器timmer,

设若明日想为index函数增加叁个客商认证的效用,能够定义叁个名称为auth的装饰器

银河国际点击登录 8

运转程序

银河国际点击登录 9

从程序实行结果可以看出,用户登陆密码验证的装饰器auth已经定义并被成功调用了

一经想为index函数增添客商认证的效果与利益,又想总括index函数推行时间的意义,在动用装饰器的处境下该怎么调用呢

银河国际点击登录 10

在上边的代码里,为index函数增多了三个装饰器,现在有四个标题,正是那多个装饰器终究哪个先被调用,哪个后被调用呢??

来深入分析一下,

如果timmer装饰器先被调用,那么程序就会先执行timmer装饰器,然后再执行auth装饰器,提示输入用户名和密码,
这样一来timmer装饰器统计的时间就会包括输入用户名和密码的时间,这个时间会远远大于index函数睡眠的2秒种;
如果auth装饰器先被调用,timmer装饰器后被调用,那么timmer装饰器统计的运行时间就应该只包括index函数的执行时间值应该在2秒多一点点的时间范围内

运作程序,先输入错误的客商名和密码以使用程序的试行时间加长

银河国际点击登录 11

从程序的实施结果能够知晓,程序是先运营timmer装饰器,然后才运转auth装饰器,所以timmer总括的时光就满含了顾客认证的时光,所以timmer统计到的程序运转时间远远高于index睡眠的2分钟

为此这里得出三个定论:

当一个函数同时被两个装饰器装饰时,加上函数最上面的装饰器先执行,加在下面的装饰器先装饰

把地点例子里的timmer装饰器和auth装饰器地方沟通一下

银河国际点击登录 12

运作index函数,依旧先输入错误的客户名和密码,扩大顾客认证的年华

银河国际点击登录 13

能够看出,此次timmer计算到的岁月只包括index函数的运作时刻,不含有顾客张开认证的时间

来剖判一下方面例子中,index函数被timmer装饰器和auth装饰器装饰的代码装饰流程

银河国际点击登录 14

在上头得出结论,多少个函数同不经常间被八个装饰器时,加在上边包车型大巴装饰器先装饰

1.timmer装饰器装饰原始的index,可以写成:index=timmer(index)2.在timmer装饰器中,timmer装饰器实际上是返回inner的内存地址,所以在这里,index=inner3.timmer装饰器装饰完成后,由auth装饰器来装饰,此时可以写成index=auth(index),4.这里auth括号里的index已经不再是原始index函数,而是已经被timmer装饰过后的index了,所以index=auth(timmer(index))5.又因为timmer装饰的结果等于inner函数的内存地址,所以:index=auth(inner)

迄今,四个装饰器的装修进度已经清楚了,来看程序的推行进度

银河国际点击登录 15

故而这里顾客输入顾客名和密码的时光不会被timmer装饰器总结在内

5.被点缀函数参数的装置与定义

先来看一段代码

银河国际点击登录 16

如上所示,home函数增添了一个参数,而index函数并未参数

依照符合规律的函数的定义与调用格局,调用index函数和home函数的章程应该是底下这种样式

index()home("python")

接下来我们运营程序就能意识,程序抛出了十二分

银河国际点击登录 17

说个特不要阐明inner函数无需地方参数,不过大家给了几个任务参数

回到timmer装饰器定义的有的,能够看出,timmer装饰器的内部函数确实并未有定义参数

那样一来,timmer装饰器只可以用来装修没有参数的函数了,

笔者们可以在timmer装饰器定义的时候为inner函数增多一个参数

银河国际点击登录 18

唯独那样一来,timmer装饰器装饰index函数的时候又会抛出非常,因为index函数未有参数

File "E:\python_learn\py_code\test.py", line 27, in <module>index()
TypeError: inner() missing 1 required positional argument: 'name'

在不知道棉被服装饰函数的参数个数的气象下,即被点缀函数的参数可变长,且情势不固定的时候,

银河国际点击登录 19

银河国际点击登录 20

银河国际点击登录 21

银河国际点击登录 22

银河国际点击登录 23

银河国际点击登录 24

相关文章

发表评论

电子邮件地址不会被公开。 必填项已用*标注

*
*
Website