python 注解的应用(上)

在 python 中是通过装饰模式来实现注解的,通过装饰模式来包裹被装饰的函数,在这个函数开始或结束运行装饰函数。有点绕,我们还是通过示例来了解 python 中的注解。

首先我们需要了解一下闭包,如果您是前端开发人员,想必闭包对您一定不陌生。闭包可是 javascript 的法宝之一。

在 python 中,也有闭包的概念。python 也是通过闭包来实现装饰模式—注解。

如果在一个内部函数里,对在外部作用域(但不在全局作用域)的变量进行引用,那么内部函数就被认为是闭包(closure)。定义在外部函数内的但由内部函数引用或者使用的变量被称为自由变量。

这就是一个闭包的示例,通常我们在函数外部是无法访问到函数内部的变量 message,我们是通过返回函数 inner_function 将这个 message 变量带出其原有作用域(outer_function 函数)。 

8207483-109cfd010272456c
8207483-241a265d99ebad9f

我们可以去掉中间变量 message 让函数看起更加简洁些。

8207483-42d9bb34c57e7fe2

在闭包基础上我们再向注解迈出两步。

8207483-332de10939a52b7a

wrapper 就是我们包裹函数,对 original_function(我们要装饰的函数)进行包裹,然后将 original_function 函数作为返回值。

8207483-d11d0a110e551259

定义 display 函数(就是被装饰的函数)然后将 display 作为参数传入到decorator_function 装饰函数中,decorated_dispay 等于 wrapper_function 返回的 original_funciton 所以执行 decorated_display 就行等执行了 display 。这与直接执行 display 的不同之处,是执行 decorated_display 会先执行 wrapper_function 中一些逻辑。

8207483-7d6f829db525d598

在返回 original_function 函数之前,打印一下 original_function的名称。运行一下看效果。看出来吧 decorated_display 就是装饰后 display 的函数。

8207483-126de2b068819e06
8207483-3def05fb0b181a8e

我们也可以通过 @ + 函数名来装饰 display 函数

其实就是等于 display = decorator_function(display)

8207483-b2e5b85750aa4997

定义的 display() 是没有参数函数,我们再定义一个带有两个参数的函数,试一试,用 decorator_function 来装饰他。

8207483-055dd41f707b5ea9

运行发现报错了,那就修改呗。

8207483-a8dbe4376981104d

我们为 wrapper_function 添加参数,然后再传入到 original_function 我们看效果。

8207483-faf10923b03d43a5
8207483-0b6d5b788ed72719

装饰也可以是 class 我们用 class 来完成 decroator_function 同样的功能

8207483-ebc8f95a40c81fcd
8207483-06bfc5cb0c0e787d

猜你喜欢

转载自blog.csdn.net/weixin_34262482/article/details/86797420