Python的装饰器中这两种写法为什么运行结果不一样?
本文介绍了Python的装饰器中这两种写法为什么运行结果不一样?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!
问题描述
问 题
方法1:
#!/usr/env/bin python
#-*- coding: utf-8 -*-
import functools
def log(func):
@functools.wraps(func)
def wrape(*args,**kw):
print 'begin call'
func(*args,**kw)
print 'end call'
return func()
return wrape
@log
def now():
print '2017年7月10日09:50:45'
now()
begin call
2017年7月10日09:50:45
end call
2017年7月10日09:50:45
[Finished in 0.1s]
方法2:
#!/usr/env/bin python
#-*- coding: utf-8 -*-
import functools
def log(func):
@functools.wraps(func)
def wrape(*args,**kw):
print 'begin call'
execute = func(*args,**kw)
print 'end call'
return execute
return wrape
@log
def now():
print '2017年7月10日09:50:45'
now()
begin call
2017年7月10日09:50:45
end call
[Finished in 0.1s]
解决方案
先来看造成差别的关键代码:
# 第一种方法:
def log(func):
@functools.wraps(func)
def wrape(*args,**kw):
print 'begin call'
func(*args,**kw)
print 'end call'
return func() # 这个地方, 重新执行了func函数, 然后才返回
return wrape
# 第二种方法:
def log(func):
@functools.wraps(func)
def wrape(*args,**kw):
print 'begin call'
execute = func(*args,**kw)
print 'end call'
return execute # 这个方法并没有执行函数, 仅仅返回而已
return wrape
造成差别的原因就是:
在上面的代码注释中其实也写到了, 差别就是在于, 在第一个方法, return的时候, 你是用func()
的形式返回的, 这样导致func再一次被执行, 所以就有多出来的那句话, 但是第二种方法, 仅仅只是返回, 并没有执行函数, 所以没有!
PS: 其实你的func
函数只是打印的话, 不需要return, 因为你return也没多大意义, return的结果也只是None而已
这篇关于Python的装饰器中这两种写法为什么运行结果不一样?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!
查看全文