要弄明白Python装饰器,从这几点开始

初次接触到装饰器,老实说,很费解,有点一知半解,想了很久懵懵懂懂的。最开始是绕开它的,但长久下去不是个办法啊。

肯定是什么概念还理解得不到位,于是重新把一些基础部分的知识点拿出来仔细研读,并且上网找一些有关的资料配合理解。总算是弄明白了:

简单说,Python装饰器就是对已有函数的再次包装,被包装的函数没有修改,却增加了功能。

这句话该怎么理解呢?

打个比方:

去水边玩,喜欢照相的我们肯定会拿起手机或者相机拍照。如果在水里玩,普通的手机、相机没法在水中工作,怎么办?最简单的办法就是在手机、相机外面套一个“防水套”,这样手机、相机就可以在水中工作了。

装饰器就像这个“防水套”,在不影响手机、相机功能的前提下,还让它们有了在水中工作的能力。

Python的装饰器怎么工作?

在程序中,装饰器动态地改变函数,方法或类的功能,而无需直接使用子类。

当需要扩展不想修改的函数的功能时,我们可以在任何地方实现装饰器模式。

也就是说,装饰器作为包装器,在目标函数执行之前和之后修改代码的行为,而不需要修改函数本身,增加原始功能,从而装饰它。

装饰器也是函数,也具备函数的特点。在Python中,“对象”贯穿始终,函数也是“对象”的一种,是First Class Object,那么,要真正弄明白装饰器,函数的以下几点要了解:小编推荐一个学Python的学习裙【五八八,零九零,九四二】,无论你是大牛还是小白,是想转行还是想入行都可以来了解一起进步一起学习!裙内有很多干货和技术分享!

1,函数是对象,可以把函数赋值给变量

2,嵌套函数,在函数内定义新的函数

3,函数可以作为参数传递给其他函数

4,函数的返回值可以是其他函数

5,内部函数调用外部参数

通常称为Closure(很多地方翻译为"闭包”),构建装饰器时常用的模式。需要注意的是,Python只允许对外部作用域进行读取,而不允许赋值。请注意下面这个例子,是如何修改上面的例子,来从内部函数的封闭范围中读取“name”参数并返回新的函数。

把上面提到的几点“函数”这个对象拥有的特性理顺,装饰器也就可以按图索骥了。

装饰器是现有函数的包装器,把这几点放在一起,我们可以建立一个装饰器。

现在开始构建装饰器

在下面例子中,让我们设计一个函数,用p标签来封装另一个函数的字符串输出。

这是我们的第一个装饰器。一个函数p_decorate把另一个函数get_text作为参数,生成一个新函数,增加原始函数的工作,并返回生成的函数,以便我们可以在任何地方使用它。

为了让get_text本身被p_decorate装饰,我们只需要将get_text赋值给p_decorate的结果。

另外需要注意的是被装饰函数需要一个参数,我们在装饰器中所做的一切就是让get_text的包装器传递这个参数。

上图这个例子虽然解释了什么是装饰器,以及装饰器怎么工作,但代码看起来很繁琐。为了避免这种情况出现,Python通过一些语法糖让装饰器变得清爽好用。

装饰get_text,我们不用my_get_text = p_decorator(get_text)这里有一个简单的办法,就是在被装饰的函数之前,用“@“加上装饰器的名字,来表明这是一个装饰器。

就这么一个“@”起头的一行,实现了函数的再次包装,让程序变得非常简洁。

同时,装饰器可以叠加使用,比如给字符串添加strong, div的标签,只要先定义两个装饰器即可。

装饰器还可以应用到类和方法上,原理一致。

本文中列举的例子对于装饰器而言都是非常简单的。装饰器可以把程序变得简洁、优雅,并且扩展更多功能。

简而言之,装饰器是扩展哪些我们不想修改的函数的功能时的最佳选择。

  • 发表于:
  • 原文链接http://kuaibao.qq.com/s/20180209A0UV1Z00?refer=cp_1026
  • 腾讯「云+社区」是腾讯内容开放平台帐号(企鹅号)传播渠道之一,根据《腾讯内容开放平台服务协议》转载发布内容。

扫码关注云+社区

领取腾讯云代金券