使用装饰器的目的是为了减少代码的修改量以及提高代码的可读性和可维护性。
先来看一个基本的函数定义:
#python2.7
def add(x,y):
return "%d+%d=%d" %(x,y,x+y)
def sub(a,b):
return "%d-%d=%d" %(a,b,a-b)
print add(2,1)
print sub(2,1)
打印结果为:
那么假设我需要在该函数里加入分割线显得更好看,一般是这样写:
#coding:utf-8
def add(x,y):
print "==================="
return "%d+%d=%d" %(x,y,x+y)
def sub(a,b):
print "==================="
return "%d-%d=%d" %(a,b,a-b)
print add(2,1)
print sub(2,1)
打印结果为:
那假设基本的那个函数定义老板不允许你进行修改,还要实现以上的效果,请参考以下代码:
#coding:utf-8
def add(x,y):
return "%d+%d=%d" %(x,y,x+y)
def sub(a,b):
return "%d-%d=%d" %(a,b,a-b)
def fgx(func):
print "==================="
return func
print fgx(add(2,1))
print fgx(sub(2,1))
打印结果为:
上面代码多加了一个函数,而这个函数的方法是打印分割线,参数是一个函数,而返回是返回函数,则可以直接使用fgx(函数的方法)。看不懂 def fgx(func): 这个的请参考四十一高阶函数写法。
那以上的方法的话,还是需要改调用函数的方法,那样如果有100个或是更多的函数时还是需要改100次或是1000次几个调用函数的方法,那么这时怎么处理呢?请参考以下代码:尝试使用@装饰器写法改为:
#coding:utf-8
def fgx(func):
print "==================="
return func
@fgx
def add(x,y):
return "%d+%d=%d" %(x,y,x+y)
@fgx
def sub(a,b):
return "%d-%d=%d" %(a,b,a-b)
print add(2,1)
print sub(2,1)
返回结果为:(而这个不是我们要的效果,那么还是需要继续修改。)
修改为:
#coding:utf-8
def fgx(func):
def f(*num):
print "==================="
return func(*num)
return f
@fgx
def add(x,y):
return "%d+%d=%d" %(x,y,x+y)
@fgx
def sub(a,b):
return "%d-%d=%d" %(a,b,a-b)
print add(2,1)
print sub(2,1)
返回结果:
理解代码:
第一个@fgx生效时,会执行函数 fgx(add(x,y)) ,而fgx(func)函数return是内部函数f,则会执行f(*num),按顺序先执行print,再接着执行func(*num),这里的func(*num) = add(x,y),则会执行def add(x,y)的函数,而add(x,y)函数return就是x+y的值。
第二个@fgx生效同理。