本文主要介绍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
就是用function2
对function1
进行装饰。