python爬东东Python

5分钟学会 Python 装饰器

2019-03-21  本文已影响301人  9ba4bd5525b9

1、解释器入门

写代码要遵循开放封闭原则,那么什么是开放封闭原则呢,简单的说就是:已经实现的功能代码块不允许被修改,但可以被扩展。即:

开放:对扩展开发;封闭:已经实现的代码块

那么问题来了如何在不更改原有代码前提下实现性能的添加,装饰器就是一个很好的用法

例如:我需要在“登录系统前添加验证功能”,在不更改现有的代码该如何实现?

1)方法1:也许有人会想到使用闭包实现,如

那么问题来了,这样的话在每个文件不同作用域里调用test功能之前都需要添加第12行: test = outer(test),那如果这样的需要添加位置较多的话也不现实,且比较难于查找,出现缺漏的结果也可以自行想象。这里就可以使用方法2

2)方法2:使用装饰器

这里可以看到只需要在test函数前加上 @outer  就可以实现,也可以这么理解  @outer --> test = outer(test)

当装饰的函数有参数时装饰器内部也必须要定义形参,即 第 2 行,在第 4 行时也必须传递参数进行调用

多个函数使用同样的验证功能时也是如此

2、多个装饰器

从结果也可以看到,当有多个装饰器时,装饰器是从内往外装饰,即:1)@outer2-->  test = outer2(test)  2) @outer1--> test = outer1(test)

执行到,15,16开始装饰时就会有输出输出23,24行,原因请看上边1)2),在装饰时也会执行outer2(),outer1()两个函数,所以会有输出结果

3、装饰器带返回值

当装饰的函数有返回值时需要将返回值返回,如第 3,4 行

4、通用装饰器

当多个函数都是用同一个装饰器的时候,参数不一致的问题,就的使用通用装饰器来解决,通用即所有的函数都适用的意思。

如上所示,test1与test2函数的参数不一致,也可以用同样的装饰器装饰,第2,3行解决

5、带参数的装饰器

当当需要通过不同参数判断装饰器该实现的不同结果时,带参数的装饰器就出现了,如上所示,在装饰器最外层在嵌套一个函数用与接收参数,通过第 4 行判断参数选择相应的功能

下面说说 14行  的执行流程  1)@f1(2) --> f1(2)  执行 f1函数并传值 2 ;  2)f1 函数返回 outer --->@outer;3)@outer --> test = outer(test)

以上就是我对装饰器的一些个人理解了。

上一篇下一篇

猜你喜欢

热点阅读