python学习笔记之装饰器、生成器、内置函数、json(五)
一、装饰器
装饰器,这个器就是函数的意思,连起来,就是装饰函数,装饰器本身也是一个函数,它的作用是用来给其他函数添加新功能比如说,我以前写了很多代码,系统已经上线了,但是性能比较不好,现在想把程序里面每个函数都加一个功能,用来统计每个函数的运行时间是多少,找出来运行比较慢的函数,来优化代码,就需要添加一个新的功能,来统计程序的运行时间,那这样的话,就得修改每个函数了,需要改代码,但是代码特别多,改完了公司倒闭了,这时候装饰器就能排上用场了,它可以不改变原有的函数,原来的函数和原来一模一样,什么都不需要改变,只需要在函数外部加上调用哪个装饰器就可以了。so,装饰器的作用就是不改变原来函数的调用方式,不改变原来函数的代码,给它增加了一个新功能。但是不改变函数,给它增加新功能,那是不可能的,装饰器只不过是偷偷改变了原来的函数而已,而原来的函数不知不觉。
概括的讲,装饰器的作用就是为已经存在的函数或对象添加额外的功能
使用装饰器需要了解的知识:
1、函数即变量,这个是什么意思呢,在python里面函数就是一个变量,函数名就是一个变量,这个函数名里面存的是这个函数的内存地址,它把函数体放到内存里,在调用的时候从函数名里面的这个内存地址找到函数体然后运行这个函数。前面的博客说函数的时候,说过函数名后面加上小括号就是调用这个函数,如果只写这个函数名的话,打印一下就是这个函数的内存地址。
为什么需要装饰器
我们假设你的程序实现了,hello,goodbye两个函数
但是在实际调用中,我们发现程序出错了,上面的代码打印了两个hello~~,经调试,我们发现是goodbye出错了,领导要求我们在调用函数之前都要记录打印一下函数的名称,可以快速定位出错的地方。比如这样
[DEBUG]: function name is hello()
hello~~
[DEBUG]: function name is goodbye()
goodbye~~
OK,现在公司有三个员工,A是毕业生,B是工作一段时间的,C是经验丰富的
A是这样写的:
B看到了,告诉A这样很LOW,其实可以这样实现:
这样写就好多了,但是每个业务函数都要去调用一下get_function这个函数,万一领导说h开头的函数就不用打印输出函数名了,是不是很难受啊~那么装饰器就开始粉墨登场了~,来跟着小波写一个装饰器。
这是最简单的装饰器,但是有一个问题,如果被装饰的函数需要传入参数,那么这个装饰器就坏了。因为返回的函数并不能接受参数,你可以指定装饰器函test1接受和原函数一样的参数,比如:
这样你就解决了一个问题,但又多了N个问题。因为函数有千千万,你只管你自己的函数,别人的函数参数是什么样子,鬼知道?还好Python提供了可变参数*args和关键字参数**kwargs,有了这两个参数,装饰器就可以用于任意目标函数了。如下: