首页 > 编程 > Python > 正文

python装饰器深入学习

2020-02-22 23:37:13
字体:
来源:转载
供稿:网友

什么是装饰器

在我们的软件产品升级时,常常需要给各个函数新增功能,而在我们的软件产品中,相同的函数可能会被调用上百次,这种情况是很常见的,如果我们一个个的修改,那我们的码农岂不要挂掉了(有人就说了 ,你笨呀,修改函数定义不就行了!同学,你醒醒吧,如果要新加的功能会修改参数,或者返回值呢?)。这个时候,就是我们装饰器大显神通的时候了。装饰器就可以实现,在不改变原函数的调用形式下(即函数的透明化处理),给函数新增功能的作用。如何实现,以及实现原理,下文会详解。

装饰器遵循的原则

装饰器,顾名思义就是起装饰的作用,既然是装饰,那么被装饰的对象是啥样就是啥样,不能有丝毫改变。在这里,我们写装饰器就是必须把握不能修改被修饰函数的源代码这条铁律。如何遵循这条铁律,我们还需还需做一些铺垫,必须先要了解三个概念,如下:

函数名即“变量”

在python中,函数名其实就像是c语言的函数指针,代表的是我们的函数地址,只有解释器获取到这个地址,它才会去执行这块内存的代码。因此,本质上,函数名就和不同变量没什么区别,只不过函数名和普通变量所指代的那块内存的使用方式不同罢了,这些都是底层解释器的机制所决定的,对于程序猿来说,都是透明的,所以,我们可以认为两者是没有区别的。

高阶函数

什么是高阶函数其实很简单,把握两个原则就好:

形式参数有函数名 返回值有函数名

只要满足这两个原则之一,就可以称之为是高阶函数。翻回头来看,这里出现了我们上面说的函数名,仔细体会一下,我们在这里不就是把其当成实参看待的吗?

嵌套函数

什么是嵌套函数其实也非常简单,把握一个原则就好:

在一个函数的函数体中去定义另一个函数

在这里需要强调的是,函数定义时是不会执行函数体的,就和定义变量是不会去读取变量里的内容一样。这一点至关重要,对于我们理解装饰器实现原理非常有帮助。

如何写装饰器

有了上文的铺垫,在现在来详解一下如何写装饰器,就好理解多了。

装饰器本质

  其实装饰器本质上就是一个函数,它也具有函数名,参数和返回值。但在python中,我们用“@auth”来表示。

@auth # 其等价于:func = auth(func)def func(): print("func called")

 这个示例就是python中如何修饰func函数的格式,当然我们还没有实现我们的装饰器函数。我们要注意的是注释里写的内容,我们可以看出:

装饰器函数其实是一个高阶函数(参数和返回值都为函数名)。 “auth(func)”是在调用我们的装饰器函数,即装饰器函数的函数体会被执行,一定要记好这一点。
发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表