装饰器 | Python高级编程

装饰器的理解

装饰器是程序开发中经常会用到的一个功能,用好了装饰器,开发效率如虎添翼,所以这也是Python面试中必问的问题,但对于好多初次接触这个知识的人来讲,这个功能有点绕,自学时直接绕过去了,然后面试问到了就挂了,因为装饰器是程序开发的基础知识,这个都不会,别跟人家说你会Python,看了下面的文章,保证你学会装饰器。

装饰器,功能就是在运行原来功能基础上,加上一些其它功能,比如权限的验证,比如日志的记录等等。不修改原来的代码,进行功能的扩展。

比如java中的动态代理,python的注解装饰器

其实python的装饰器,是修改了代码。

多个装饰器

运行结果:

装饰器功能

1、引入日志

2、函数执行时间统计

3、执行函数前预备处理

4、执行函数后清理功能

5、权限校验等场景

6、缓存

装饰器示例

1、无参数的函数

运行结果:

上面代码理解装饰器执行行为可理解成

foo = timefun(foo)

foo先作为参数赋值给func后,foo接收指向timefun返回的wrappedfunc

foo()

调用foo(),即等价调用wrappedfunc()

内部函数wrappedfunc被引用,所以外部函数的func变量(自由变量)并没有释放

func里保存的是原foo函数对象

2、被装饰的函数有参数

运行结果:

3、被装饰的函数有不定长参数

运行结果:

4、装饰器中的return

此时timefun无返回值,运行结果:

如果修改装饰器为return func(),则运行结果:

运行结果:

总结

一般情况下为了让装饰器更通用,可以有return

装饰器带参数,在原有装饰器的基础上,设置外部变量

运行结果:

类装饰器(扩展)

装饰器函数其实是这样一个接口约束,它必须接受一个callable对象作为参数,然后返回一个callable对象。在Python中一般callable对象都是函数,但也有例外。只要某个对象重写了__call__()方法,那么这个对象就是callable的。

运行结果:

说明:

1.当用Test来装作装饰器对test函数进行装饰的时候,首先会创建Test的实例对象,并且会把test这个函数名当做参数传递到__init__方法中,即在__init__方法中的func变量指向了test函数体

2. test函数相当于指向了用Test创建出来的实例对象

3.当在使用test()进行调用时,就相当于让这个对象(),因此会调用这个对象的__call__方法

4.为了能够在__call__方法中调用原来test指向的函数体,所以在__init__方法中就需要一个实例属性来保存这个函数体的引用,所以才有了self.__func = func这句代码,从而在调用__call__方法中能够调用到test之前的函数体。

@Test

deftest():

print("----test---")

test()

showpy()

如果把这句话注释,重新运行程序,依然会看到"--初始化--"

原文发布于微信公众号 - 人工智能LeadAI(atleadai)

原文发表时间:2017-10-21

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏Ryan Miao

java基础面试题

参考:http://blog.csdn.net/jackfrued/article/details/44921941 说未经允许不转载,我只好参考了。 1.面向...

3725
来自专栏叁金大数据

自学Python三 Python中的屠龙刀(续)

  在函数代码功能运行期间动态增加功能的方式叫做装饰器(Decorator)。它对一个函数或者类进行再加工。

1042
来自专栏JetpropelledSnake

Python入门之装饰器

讲 Python 装饰器前,我想先举个例子,虽有点污,但跟装饰器这个话题很贴切。 每个人都有的内裤主要功能是用来遮羞,但是到了冬天它没法为我们防风御寒,咋办?我...

30612
来自专栏算法修养

Code Forces 149DColoring Brackets(区间DP)

 Coloring Brackets time limit per test 2 seconds memory limit per test 256...

3126
来自专栏我是攻城师

Apache Pig学习笔记之内置函数(三)

4424
来自专栏WindCoder

Java设计模式学习笔记—装饰器模式

文章最后“Java设计模式笔记示例代码整合”为本系列代码整合,所有代码均为个人手打并运行测试,不定期更新。本节内容位于其Decorator包(package)中...

1221
来自专栏xingoo, 一个梦想做发明家的程序员

【设计模式】—— 装饰模式Decorator

  模式意图   在不改变原来类的情况下,进行扩展。   动态的给对象增加一个业务功能,就功能来说,比生成子类更方便。   应用场景   1 在不生成子类的情...

2177
来自专栏python3

python 装饰器

装饰器本质上是一个Python函数,它可以让其他函数在不雲要做任何代码变动的前提下增加额外功能,装饰器的返回值也是一个函数对象。

1171
来自专栏开发与安全

《linux c 编程一站式学习》课后部分习题解答

1、假设变量x和n是两个正整数,我们知道x/n这个表达式的结果要取Floor,例如x是17,n是4,则结果是4。如果希望结果取Ceiling应该怎么写表达式呢?...

4576
来自专栏CDA数据分析师

教你一招 | Python装饰器的另类用法

之前有比较系统介绍过Python的装饰器(请查阅《详解Python装饰器》http://betacat.online/posts/python-decorato...

1888

扫码关注云+社区

领取腾讯云代金券