在这里主要是想介绍下,Python中的@装饰器。这里就直接举几个例子来说明一下(主要是为了使自己不要太容易忘掉这个@的简单的用法)。
首先,举个最简单的例子:
def log(func):
print "start %s" %func
@log
def func_a():
print "this is the function of a"
这个代码,如果运行起来的话,运行结果如下所示:
start <function func_a at 0x7f33e59b3668>
这里如果按照一般的解读的话,会发现出来一个@运算符,然后我就自行忽略掉这个不常见的符号,接下来又是一个函数的定义,整个代码中没有任何执行函数的代码,可是运行的时候,却出现结果了?为什么会这样?主要是因为@运算符的原因。@运算符,这里叫做装饰器,它表示的意思是:
func_a = log(func_a)
也就是说:@运算符后边的变量log是一个函数对象。然后@log后边的func_a函数,是作为log的形参的。所以@log,就是执行了log(func_a)这个函数,所以就打印了上面结果的输出。
接下来讲一个比较实用的代码,也就是为了在每次函数执行的时候,都打印一些比较基础log的信息:
1 #-*- coding: utf-8 -*-
2 def log(func):
3 def wrapper(*arg,**kw):
4 print"Start%s"%func
5 print arg
6 print kw
7 return wrapper
8 @log
9 #@log 这个等价于
10 # func_a = log(func_a)
11 #然而这里需要注意的是log返回的函数是wrapper
12 #所以这里的func_a = log(func_a) = wrapper
13 #所以这里的func_a函数就是现在的wrapper函数了!
14 #所以你执行func_a的时候就得是执行wrapper了,因为现在func_a
15 #就是wrapper函数了,可以理解为引用!
16 def func_a():
17 print"This is the function a"
18 @log
19 def func_b(arg):
20 print"this is the function b"
21 func_a((1,2,3),name="hello")
这里的关于@的解释,在代码中也详细的解释了。但是一定要记住@这个装饰器表示的是:@后边跟的变量名为被调用的函数,@后边定义的函数,作为被调用函数的一个形参。然后作为形参的函数作为左值运算对象,作为@后边变量的函数作为右值。也就是这个公式:
function_1(func)
@function_1
function_2()
@function_1表示的意思就是function_2=function_1(function_2)
在这里还需要解释的一点是:function_1()和function_1是两个不一样的东西,function_1()表示的是调用function_1这个函数;而function_1表示的是function_1这个函数,不会调用这个函数,可以作为赋值运算符的右值对象!