Python的装饰器中这两种写法为什么运行结果不一样?

查看:109
本文介绍了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屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆