在 python 中是通过装饰模式来实现注解的,通过装饰模式来包裹被装饰的函数,在这个函数开始或结束运行装饰函数。有点绕,我们还是通过示例来了解 python 中的注解。
首先我们需要了解一下闭包,如果您是前端开发人员,想必闭包对您一定不陌生。闭包可是 javascript 的法宝之一。
在 python 中,也有闭包的概念。python 也是通过闭包来实现装饰模式—注解。
如果在一个内部函数里,对在外部作用域(但不在全局作用域)的变量进行引用,那么内部函数就被认为是闭包(closure)。定义在外部函数内的但由内部函数引用或者使用的变量被称为自由变量。
这就是一个闭包的示例,通常我们在函数外部是无法访问到函数内部的变量 message,我们是通过返回函数 inner_function 将这个 message 变量带出其原有作用域(outer_function 函数)。
我们可以去掉中间变量 message 让函数看起更加简洁些。
在闭包基础上我们再向注解迈出两步。
wrapper 就是我们包裹函数,对 original_function(我们要装饰的函数)进行包裹,然后将 original_function 函数作为返回值。
定义 display 函数(就是被装饰的函数)然后将 display 作为参数传入到decorator_function 装饰函数中,decorated_dispay 等于 wrapper_function 返回的 original_funciton 所以执行 decorated_display 就行等执行了 display 。这与直接执行 display 的不同之处,是执行 decorated_display 会先执行 wrapper_function 中一些逻辑。
在返回 original_function 函数之前,打印一下 original_function的名称。运行一下看效果。看出来吧 decorated_display 就是装饰后 display 的函数。
我们也可以通过 @ + 函数名来装饰 display 函数
其实就是等于 display = decorator_function(display)
定义的 display() 是没有参数函数,我们再定义一个带有两个参数的函数,试一试,用 decorator_function 来装饰他。
运行发现报错了,那就修改呗。
我们为 wrapper_function 添加参数,然后再传入到 original_function 我们看效果。
装饰也可以是 class 我们用 class 来完成 decroator_function 同样的功能
网友评论