先看代码:
def out(): print('out') def inner(): return 'inner' return inner() if __name__ == '__main__': print(type(out()))输出结果:
out <class 'str'>我们看到type函数的参数是out(),执行的过程就是:out() --> inner() --> type(inner()),type里的参数实际上是inner, 最后的打印结果就是<class 'str'>。代码通过执行out函数,得到最终的参数。若改成print('inner')结果就是None类型。
代码:
import time import functools def timing(status='Train'): print('1') def dec(func): print('2') @functools.wraps(func) def wrapper(*args, **kwargs): start = time.time() func1 = func(*args, **kwargs) print('[%s] time: %.3f s ' % (status, time.time() - start)) return func1 return wrapper return dec @timing(status='Train') def Training(): time.sleep(3) print('over') if __name__ == '__main__': print('main') print('*' * 10) print(type(Training()))输出结果:
1 2 main ********** over [Train] time: 3.000 s <class 'NoneType'>关于这段带代码,可能疑问点在于在main前面的‘1’‘1’,导致这个的原因是因为timing()函数作为装饰器时执行函数的预处理功能,先timing()函数的执行,先返回dec然后执行dec(),且Training()作为该函数的参数,即dec(Training()),然后就是wrapper()函数。此时Training = timing(dec(Training())),这就是其中的‘1’‘2’的由来,也就是预处理完毕。然后就执行main函数的代码。当执行print(type(Training()))时,就就执行wrapper(),然后就是func1 = fun() = Training() = None。因为Training()函数是打印一句话,所以说返回值为None,所以最后的结果就是None Type。