之前对于http://bbs.csdn.net/topics/390825556一直不理解下面的输出结果为什么是这样,现在终于有所领悟,正如绝大多数资料说的那样
装饰器相当于f = deco_functionNeedDoc(f) ,而这种替换时函数在执行前就替换好的,所以在执行这种替换时print doc就首先全部被执行了;
要想不被先执行就应该把判断doc的语句放到返回的函数中,所以应该在装饰器中加一个闭包,并将其返回,这样就OK了
def deco_functionNeedDoc(func):
if func.__doc__ == None :
print func, "has no __doc__, it's a bad habit."
else:
print func, ':', func.__doc__, '.'
return func()
#@deco_functionNeedDoc
def f():
print 'f() Do something'
#@deco_functionNeedDoc
def g():
'I have a __doc__'
print 'g() Do something'
#f()
#g()
f = deco_functionNeedDoc(f)
g = deco_functionNeedDoc(g)
f()
g()