python函数装饰器的作用和功能

python的装饰器是什么?我们该如何更好地更通俗地理解?

就两字——扩展。我们来举一个例子:

我们把“有生命的、能动的定义为动物”。接着,我们把这个定义当作(封装成)基类。然后,我们在此基础上进行扩展,比如我们可以把“有生命、能动的且有翅膀的动物定义为禽类”,也可以把“有生命的、能动的吃了睡睡了吃的定义为畜类”。当然,我们可以在禽类和畜类的基础上进行进一步的扩展。

python的装饰器,个人认为也可以进行这样的理解。python的函数和类都有装饰器的设计,这一节,我们来先介绍一下函数的装饰器。

python函数装饰器

python函数装饰器的语法如下:

@decorator
def x1y1z1():
    pass

语法解析

python的装饰器用“@”符号进行标记,后面的decorator是函数名,二者构建了装饰器,下面的紧跟着的(必须是紧跟着的)x1y1z1函数是被decorator装饰器装饰的函数。在介绍装饰器的作用和功能及其机制之前,我们来先看一个装饰器的实例。

装饰器实例

#创建装饰器函数,跟声明其他一般函数最大的不同时,装饰器函数的参数一般为被装饰的函数的名称
def dec(func):
    def 
    print('现在执行的是装饰器,恭喜你创建装饰器成功')
    func()
#接下来,我们创建装饰器,并声明一个被装饰的函数
@dec
def x1():
    print('现在执行的是被装饰的函数')

@dec
def y1():
    print('现在轮到被装饰的函数y1')
——————————————————————————————————
现在执行的是装饰器,恭喜你创建装饰器成功
现在执行的是被装饰的函数x1
现在执行的是装饰器,恭喜你创建装饰器成功
现在轮到被装饰的函数y1
 

实例解析

如上代码及其运行的结果,我们可以看出装饰器的运行机制是这样的:

  • python代码自上而下的顺序执行,遇到函数代码块时,并没有执行,而是保存在内存(遇到调用时才会执行);
  • 当python执行代码到“@”标记符号时,装饰器的功能开始发挥作用,将被装饰器的函数作为参数传递给装饰器函数,如上面代码的x1函数和y1函数为被装饰的函数,dec函数为装饰器函数。
  • python先执行装饰器函数(之前已经保存在内存当中且并没有执行,现在开始执行)
  • python在装饰器函数当中执行被装饰的函数;
  • 装饰器与装饰器之间也按自上而下的顺序进行执行;

多重装饰器

一个函数是否可以被多个装饰器装饰呢?答案是可以的,如下实例:

def dec(func):
    def indec():
        print('现在执行的是第一层的装饰器dec')
        func()
    return indec
    

def x1(func):
    def inx1():
        print('现在执行的是第二层的装饰器x1')
        func()
    return inx1
    
@dec
@x1
def y1():
    print('现在轮到被装饰的函数y1')

y1()
————————————————————————————————————————
现在执行的是第一层的装饰器dec
现在执行的是第二层的装饰器x1
现在轮到被装饰的函数y1
 

多重装饰器实例解析

步骤:如上面的代码,通过双重装饰器的执行结果,我们可以发现,装饰器是逐层进行执行的,上面首先执行的是第一层的装饰器dec,该过程中将装饰器函数x1作为参数传递给dec函数;而在dec装饰器函数中执行被dec装饰的函数x1的过程中,作为y1函数的装饰函数x1又将y1作为参数传递给x1函数。

强调:上面的代码中,我们调用了y1()函数,装饰器函数才发挥了作用,而在上面的不是多重装饰器的代码当中,并没有这样调用便可执行。

注意1、:上面的两个装饰器函数,我们都运用了内嵌的函数,即函数内部嵌套函数,如果像上面那样没有嵌套而直接调用,那么在执行第一层装饰器函数的传递参数(该参数为x1)的过程中会引发TypeError: 'NoneType' object is not callable的错误。

注意2、:上面的两个装饰器函数,我们的return的是函数,而不是调用函数的形式,调用函数的形式是函数名加“()”,如果返回函数的调用,会发生TypeError: 'NoneType' object is not callable的错误。但是,一般的内嵌函数调用函数的引用并不会发生这样的错误。为什么呢?我们下一章节将进行这部分内容的介绍。



全栈后端 / python教程 :


























Copyright © 2022-2024 笨鸟工具 x1y1z1.com All Rights Reserved.