Python中装饰器的原理

栏目: Python · 发布时间: 7年前

内容简介:装饰器这玩意挺有用,当时感觉各种绕,现在终于绕明白了,俺滴个大爷,还是要慢慢思考才能买明白各种的真谛,没事就来绕一绕def outer(func):def inner():

装饰器这玩意挺有用,当时感觉各种绕,现在终于绕明白了,俺滴个大爷,还是要慢慢思考才能买明白各种的真谛,没事就来绕一绕

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.仅仅是添加了一个装饰函数,就实现了我们的需求,在函数调用前先认证,调用后写入日志,这就是装饰器的最大作用。

Linux公社的RSS地址https://www.linuxidc.com/rssFeed.aspx

本文永久更新链接地址: https://www.linuxidc.com/Linux/2018-11/155418.htm


以上就是本文的全部内容,希望本文的内容对大家的学习或者工作能带来一定的帮助,也希望大家多多支持 码农网

查看所有标签

本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们

最优状态估计

最优状态估计

[美] D. 西蒙 / 张勇刚、李宁、奔粤阳 / 国防工业出版社 / 2013-5-1 / 68.00元

《最优状态估计——卡尔曼H∞及非线性滤波》共分为四个部分,全面介绍了最优状态估计的理论和方法。第1部分为基础知识,回顾了线性系统、概率论和随机过程相关知识,介绍了最小二乘法、维纳滤波、状态的统计特性随时间的传播过程。第2部分详细介绍了卡尔曼滤波及其等价形式,介绍了卡尔曼滤 波的扩展形式,包括相关噪声和有色噪声条件下的卡尔曼滤波、稳态滤波、衰减记忆滤波和带约束的卡尔 曼滤波等。第3部分详细介绍了H∞......一起来看看 《最优状态估计》 这本书的介绍吧!

RGB CMYK 转换工具
RGB CMYK 转换工具

RGB CMYK 互转工具

HEX CMYK 转换工具
HEX CMYK 转换工具

HEX CMYK 互转工具