python学习笔记--装饰器

1.首先是一个很无聊的函数,实现了两个数的加法运算:

def f(x,y):
print x+y
f(2,3)

输出结果也ok

5

2.可是这时候我们感觉输出结果太单一了点,想让代码的输出多一点看起来不这么单调:

def showInfo(fun):
def wrap(x,y):
print "The function before"
func(x,y)
print "The function after"
return wrap def f(x,y):
print x+y f = showInfo(f)
f(2,3)

此时的输出:

The function before
5
The 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 wrap def f1(x,y):
print x*y f1 = showInfo(f1)
f1(2,3)
The function before
6
The 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 before
5
The function after
The function before
6
The function after

总结:这正是python装饰器意义所在的地方。python中的可调用对象包括函数 方法 实现了__call__方法的类。python中的函数也是对象,可以作为高阶函数的参数传入或返回值返回。因此我们可以用高阶函数对某个函数进行封装,这就是python中的装饰器。他的语法结构类似这样:

@decorator
def func(func):
  pass
上一篇:python学习之装饰器-


下一篇:Python学习 :装饰器