我们知道,在 Python 中,我们可以像使用变量一样使用函数:
-
函数可以被赋值给其他变量
-
函数可以被删除
-
可以在函数里面再定义函数
-
函数可以作为参数传递给另外一个函数
-
函数可以作为另一个函数的返回
简而言之,函数就是一个对象。
对一个简单的函数进行装饰
为了更好地理解装饰器,我们先从一个简单的例子开始,假设有下面的函数:
1
2
|
def
hello():
return
'hello world'
|
现在我们想增强 hello() 函数的功能,希望给返回加上 HTML 标签,比如 <i>hello world</i>,但是有一个要求,不改变原来hello() 函数的定义。这里当然有很多种方法,下面给出一种跟本文相关的方法:
1
2
3
4
|
def
makeitalic(func):
def
wrapped():
return
"<i>"
+
func()
+
"</i>"
return
wrapped
|
在上面的代码中,我们定义了一个函数 makeitalic,该函数有一个参数 func,它是一个函数;在 makeitalic 函数里面我们又定义了一个内部函数 wrapped,并将该函数作为返回。
现在,我们就可以不改变 hello() 函数的定义,给返回加上 HTML 标签了:
1
2
3
|
>>> hello
=
makeitalic(hello)
# 将 hello 函数传给 makeitalic
>>> hello()
'<i>hello world</i>'
|
在上面,我们将 hello 函数传给 makeitalic,再将返回赋给 hello,此时调用 hello() 就得到了我们想要的结果。
不过要注意的是,由于我们将 makeitalic 的返回赋给了 hello,此时 hello() 函数仍然存在,但是它的函数名不再是 hello 了,而是 wrapped,正是 makeitalic 返回函数的名称,可以验证一下: