import logging
defuse_logging(func):defwrapper(*args,**kwargs):
logging.warn("%s in running" % func.__name__)
return func(*args,**kwargs)
return wrapper
defbar():print ("i am bar")
bar =use_logging(bar)
print bar()
print"bar.__name__",bar.__name__
@use_loggingdeffoo():print"i am foo"print foo()
print"foo.__name__",foo.__name__
from functools import wraps
deflogged(func):@wraps(func)defwith_logging(*args,**kwargs):print func.__name__ + " was called"return func(*args,**kwargs)
return with_logging
@loggeddeff(x):return x+x*x
print f(1)
print"f.__name__",f.__name__
==============
结果
==============
i am bar
WARNING:root:bar in running
None
WARNING:root:foo in running #解决调用函数时想使用额外的附加条件时的复用问题
bar.__name__ wrapper #解决函数属性发生改变的问题
i am foo
None
foo.__name__ wrapper #解决函数属性发生改变的问题
f was called #解决调用函数时想使用额外的附加条件时的复用问题2
f.__name__ f #解决函数属性发生改变的问题