python闭包特性&&python函数装饰器
学习中闭包的特性利用笔记&&python函数装饰器
本质是python的’一切皆对象’(雾)
闭包的特性利用
闭包的1个重要特性是: python里嵌套函数阔以记得使用过的外部函数
甚么意思捏?
eg:
1 |
|
结果:
dick
上述代码函数内写了个函数bar(), 并把bar()函数作为1个变量返回(因为py中,函数和变量等价,等价,等价)
而在此介绍py闭包的一个特性:嵌套函数会记住使用过的外部变量
eg:
1 |
|
结果:
shit
上述代码和python的特性8符合,当return bar之后,e作为局部变量会被销毁,但是结果却成功输出了,这就因为python的另一个特性: 嵌套函数会记住使用过的外部变量(局部变量销毁后仍会被嵌套函数记住)
所以这个特性有毛用呢?
用来生成8同函数
eg:
1 |
|
result:
300
上述例子就可以利用该特性批量生成8同函数
还有什么用呢?好像没了
可以取代生成全局变量
eg:
1 |
|
函数装饰器
装饰器本质是函数或者类,他的作用是: 为原来的函数增加新的功能。装饰,顾名思义,就是在事物8变的基础上实现一些扩展
应用场景: 某天,你用python写了1堆函数,然后你突然想为这些函数加1个相同的功能,比如print(“d1ck”),那么1个1个改就很麻烦,那么装饰器就派上了用场~
eg:
1 |
|
结果:
>>>abc
>>>d3f
这个函数我没看懂….感觉有点毛病(它func2返回的8还是原来的func1吗?),但是8太要紧,反正只要知道装饰器大致都是这么写的就好了,然后这样做也实现了修改函数的功能
然后研究了1下,把这认为是装饰器的1种新姿势吧….上面代码定义ch4nge_func里把return func1换成func1(),结果也还是一样的
然后写完了ch4nge_func后,再进行调用就阔以实现修改函数的目的啦,有2种调用方式,1种是func2=ch4nge_func(func1)就改成了新函数(若8想新生成函数也可func1=ch4nge_func(func1));还有1种那就是用python的语法糖,比如上述代码用语法糖简化就是:
1 |
|
再深入学习一下,了解一下装饰器的另1特性
装饰器修改函数后改变了原函数名字: functools.wraps
1 |
|
运行结果:
>>>func2
然而你想的打印结果应该是 abc 对8对? 这是因为func2重写了func1和其注释文档,多数情况下无伤大雅,如果你想保持原状,只要用到functools库里的wraps函数就阔以了
在定义装饰器函数时第一行顺便写入@wraps(‘你传入的func’)就阔以了,eg:
1 |
|
结果: >>>abc
应用
在web中检查某用户是否有权限访问web某页面: 没看懂,就8贴源码了
总之原理先搞懂,应用以后应该会用得上的(咕)