1.首先是一个很无聊的函数,实现了两个数的加法运算:
def f(x,y): print x+yf(2,3)
输出结果也ok
5
2.可是这时候我们感觉输出结果太单一了点,想让代码的输出多一点看起来不这么单调:
def showInfo(fun): def wrap(x,y): print "The function before" func(x,y) print "The function after" return wrapdef f(x,y): print x+yf = showInfo(f)f(2,3)
此时的输出:
The function before5The function after
3.此时我们又定义了一个f1()函数也希望它和f()函数有一样的输出格式,只要在f1()执行之前调用一次showInfo()函数:
def showInfo(fun): def wrap(x,y): print "The function before" func(x,y) print "The function after" return wrapdef f1(x,y): print x*yf1 = showInfo(f1)f1(2,3)
The function before6The function after
4.此时我知道你应该大概解到了函数修饰的作用了,可是你会发现我们本义是想调用f()函数的,可是在调用的过程中使用了两次调用才得到了我们想要的效果。所以我们使用python提供的装饰器方法来修改我们的代码:
def showInfo(func): def wrap(x,y): print "The function before" func(x,y) print "The function after" return wrap @showInfo def f(x,y): print x+y @showInfo def f1(x,y): print x*y f(2,3) f1(2,3)
这次的结果如下,我们只需直接调用我们要用的函数就得到了我们想要的结果了:
The function before5The function afterThe function before6The function after
总结:这正是python装饰器意义所在的地方。python中的可调用对象包括函数 方法 实现了__call__方法的类。python中的函数也是对象,可以作为高阶函数的参数传入或返回值返回。因此我们可以用高阶函数对某个函数进行封装,这就是python中的装饰器。他的语法结构类似这样:
@decoratordef func(func): pass