包含python装饰器原函数的词条( 三 )


原文
如何理解Python装饰器简言之,打个比方,我写了一个python的插件,提供给用户使用,但是在使用的过程中我添加了一些功能,可是又不希望用户改变调用的方式 , 那么该怎么办呢?这个时候就用到了装饰器 。
python装饰器就是用于拓展原来函数功能的一种函数,这个函数的特殊之处在于它的返回值也是一个函数,使用python装饰器的好处就是在不用更改原函数的代码前提下给函数增加新的功能 。一般而言,我们要想拓展原来函数代码,比较直接的办法就是侵入代码里面修改 。
而且装饰器是程序开发中经常会用到的一个功能,用好了装饰器,开发效率如虎添翼,所以这也是Python面试中必问的问题,但对于好多小白来讲 , 这个功能有点绕,自学时直接绕过去了,然后面试问到了就挂了,因为装饰器是程序开发的基础知识 , 不懂就太说不过去啦 。
讲完装饰器,相信大家对于Python的发展前景也比较感兴趣,随着人工智能的发展 , Python作为人工智能的首选语言,自然也是发展得如火如荼 。现在入行,肯定是一个好时机!
python装饰器听了N次也没印象 , 读完这篇你就懂了装饰器其实一直是python装饰器原函数我的一个"老大难" 。这个知识点就放在那python装饰器原函数,但是拖延症 。。。
其实在平常写写脚本的过程中,这个知识点python装饰器原函数你可能用到不多
但在面试的时候,这可是一个高频问题 。
所谓的装饰器 , 其实就是通过装饰器函数,来修改原函数的一些功能,使得原函数不需要修改 。
这一句话理解起来可能没那么轻松,那先来看一个"傻瓜"函数 。
放心,绝对不是"Hello World"!
怎么样,没骗你吧? 哈哈,这个函数不用运行相信大家都知道输出结果: "你好,装饰器"。
那如果我想让 hello() 函数再实现个其他功能,比如多打印一句话 。
那么 , 可以这样"增强"一下:
运行结果:
很显然,这个"增强"没啥作用,但是可以帮助理解装饰器 。
当运行最后的 hello() 函数时,调用过程是这样的:
那上述代码里的 my_decorator() 就是一个装饰器 。
它改变了 hello() 的行为 , 但是并没有去真正的改变 hello()函数 的内部实现 。
但是,python一直以"优雅"被人追捧,而上述的代码显然不够优雅 。
所以,想让上述装饰器变得优雅 , 可以这样写:
这里的 @my_decorator 就相当于旧代码的 hello = my_decorator(hello),@ 符号称为语法糖 。
那如果还有其他函数也需要加上类似的装饰,直接在函数的上方加上 @my_decorator 就可以,大大提高函数
的重复利用与可读性 。
输出:
上面的只是一个非常简单的装饰器 , 但是实际场景中,很多函数都是要带有参数的,比如hello(people_name) 。
其实也很简单,要什么我们就给什么呗,直接在对应装饰器的 wrapper() 上 , 加上对应的参数:
输出:
但是还没完 , 这样虽然简单,但是随之而来另一个问题:因为并不是所有函数参数都是一样的,
当其他要使用装饰器的函数参数不止这个一个肿么办?比如:
没关系,在python里, *args 和 **kwargs 表示接受任意数量和类型的参数,所以我们可以这样
写装饰器里的 wrapper() 函数:
同时运行下 hello("老王"),和 hello3("张三", "李四"),看结果:
上面2种,装饰器都是接收外来的参数,其实装饰器还可以接收自己的参数 。
比如,我加个参数来控制下装饰器中打印信息的次数:

推荐阅读