给函数加上头尾(before、after)
闭包
def outer(origin):
def inner():
print 'before...'
res = origin()
print 'after...'
return res
return inner
def func():
print 'run function...'
return 1
1-
print 'before...'
print func()
print 'after...'
2-
func = outer(func)
result = func()
print result
- 装饰器
python内部执行decorator(fun),结构赋值给fun
相当于fun=decorator(fun)
@decorator
def fun():
pass
3-
@outer
def func():
print 'run function...'
return 1
result = func()
print result
在这个例子下还是方法一更加简单易懂。
但是如果需要很多函数加上头尾,明显装饰器的方法更加合适,利于维护
装饰的函数需要传入多个参数时,可以动态传参
# 例如
# 需要在inner和orgin加上动态参数
def outer(origin):
def inner(*arg, **kwargs):
print 'before...'
res = origin(*arg, **kwargs)
print 'after...'
return res
return inner
##################################
@outer
def func1(a):
print 'run function...'
return 1
@outer
def func2(a, b):
print 'run function...'
return 1
##################################
func1(1)
func2(1,2)
functools
@functools.wraps(origin)
可以使装饰器函数的name,doc保持为原函数的内容
import functools
def outer(origin):
@functools.wraps(origin)
def inner():
res = origin()
return res
return inner