Python decorators

本文主要介绍Python中decorator的有关知识,所举例子来源于https://www.programiz.com/python-programming/decorator

背景

首先从一个例子出发,简要介绍为什么我们需要decorator。假设我们有一个函数divide,用于执行除法操作:

def divide(a, b):
    return a / b

在数学上,除数b为0时会产生错误,我们希望为这个函数增加一个检查的功能,当除数为0时给出提示。首先想到的是修改divide函数,那么还有没有其他的方法呢?Python提供了一种特性,可以对函数进行装饰。

前置知识

要想理解decorator,首先要知道python中的函数跟普通变量一样是一个object,它可以被作为参数传递给函数,可以被函数返回,函数名仅仅是一个标识符,可以将函数赋给另外一个变量。下面举一个例子:

def divide(a, b):
    return a / b

divide(4, 2)
second_divide = divide
second_divide(4, 2)

其中,second_divide将与divide产生相同的结果。

注意

function代表的是函数本身,function()则代表的是函数执行的结果。二者进行赋值后的效果是不同的。

decorator

现在我们来看如何利用函数的上述特性装饰原始的divide函数。

def smart_divide(func):
    def inner(a, b):
        if b == 0:
            print("Whoops! cannot divide")
            return
       return func(a, b)
    return inner

def divide(a, b):
    return a / b

divide = smart_divide(divide)

在最后一条赋值语句中,我们将smart_divide的返回值,也就是inner函数赋给了divide这一标识符,而在inner函数中,会访问原来的divide函数,因此之后使用divide函数就可以对除数做检查。

类似上面的赋值语句在Python中很常用,因此Python提供了一种简化的写法:

def smart_divide(func):
    def inner(a, b):
        if b == 0:
            print("Whoops! cannot divide")
            return
       return func(a, b)
    return inner

@smart_device
def divide(a, b):
    return a / b

也就是说,在function1前面加上function2就是用function2function1进行装饰。

你可能感兴趣的:(Python decorators)