断刀朝鲜大逆转全集,慕春佑,朱秀华
装饰器这玩意挺有用,当时感觉各种绕,现在终于绕明白了,俺滴个大爷,还是要慢慢思考才能买明白各种的真谛,没事就来绕一绕
def outer(func):
def inner():
print("认证成功")
result=func()
print("登录成功")
return result
return inner
@outer
def oa():
print("oa接口")
这里面需要注意的是:
- @outer和@outer()有区别,没有括号时,outer函数依然会被执行,这和传统的用括号才能调用函数不同,需要特别注意!
- 是oa这个函数名(而不是oa()这样被调用后)当做参数传递给装饰函数outer,也就是:func = oa,@outer等于outer(oa),实际上传递了oa的函数体,而不是执行oa后的返回值。
- outer函数return的是inner这个函数名,而不是inner()这样被调用后的返回值。
1. 程序开始执行outer函数内部的内容,一开始它又碰到了一个函数,inner函数定义块被程序观察到后不会立刻执行,而是读入内存中。
2. 再往下,碰到return inner,返回值是个函数名,并且这个函数名会被赋值给oa这个被装饰的函数,也就是oa = inner,此时oa函数被新的函数inner覆盖了(实际上是oa这个函数名更改成指向inner这个函数名指向的函数体内存地址,oa不再指向它原来的函数体的内存地址),再往后调用oa的时候将执行inner函数内的代码,而不是先前的函数体。那么先前的函数体去哪了?还记得我们将oa当做参数传递给func这个形参么?func这个变量保存了老的函数在内存中的地址,通过它就可以执行 老的函数体,你能在inner函数里看到result = func()这句代码,它就是这么做的!
3.接下来,还没有结束,依然通过oa()的方式调用oa 函数时,执行的就不再是老的oa函数的代码,而是inner函数的代码。在本例中,它首先会打印个“认证成功”的提示,然后,它会执行func函数并将返回值赋值个变量result,这个func函数就是老的oa函数;接着,它又打印了“登陆成功”的提示;最后返回result这个变量。我们可以用 r = oa()的方式接受result的值。
4.仅仅是添加了一个装饰函数,就实现了我们的需求,在函数调用前先认证,调用后写入日志,这就是装饰器的最大作用。
如对本文有疑问,请在下面进行留言讨论,广大热心网友会与你互动!!
点击进行留言回复
相关文章:
-
-
python如何查看网页代码
用python查看网页代码的方法:1、使用“import”导入requests包import requests2、使用requests包的get()函数通过网页...
[阅读全文]
-
-
python如何保存文本文件
python保存文本文件的方法:使用python内置的open()类可以打开文本文件,向文件里面写入数据可以用write()函数,写完之后,使用close()函...
[阅读全文]
-
python如何编写win程序
python可以编写win程序。win程序的格式是exe,下面我们就来看一下使用python编写exe程序的方法。编写好python程序后py2exe模块即可将...
[阅读全文]
-
-
-
-
-
-
网友评论