python装饰器的一个小问题

断水为桥 发布于 2013/09/07 13:37
阅读 334
收藏 1


from time import ctime,sleep


def tsfunc(func):
    def wrappedFunc():
        print '[%s] %s called'%(ctime(),func.__name__)
        return func()
    return wrappedFunc()


@tsfunc

def foo():

    pass



foo()
sleep(4)


for i in range(2):
    sleep(1)
    foo()

最近看python装饰器时候的一个小例子,但是我把书上的代码运行一下,却得到一个错误。 File "deco.py", line 15, in <module>
    foo()

TypeError: 'NoneType' object is not callable

我是按照书上敲得代码啊,不知道为什么会有错误。怎么改正

加载中
0
gnefil.nil
gnefil.nil
return wrappedFunc 不是 return wrappedFunc()
断水为桥
确实解决了,您能给解释一下这是什么原因吗?前几行的return foo()为什么有括号呢
0
Garfielt
Garfielt

引用来自“gnefil.nil”的答案

return wrappedFunc 不是 return wrappedFunc()
return func() func在这里是修饰器传入的变量,也就是修饰器所修饰的方法,执行当然要加(),wrappedFunc 是引用,无需加()。
断水为桥
如果不考虑装饰器,只考虑函数。一个函数如果要以另一个函数作为返回值,是不是就应该返回引用?
0
Garfielt
Garfielt

引用来自“Garfielt”的答案

引用来自“gnefil.nil”的答案

return wrappedFunc 不是 return wrappedFunc()
return func() func在这里是修饰器传入的变量,也就是修饰器所修饰的方法,执行当然要加(),wrappedFunc 是引用,无需加()。
这个就是修饰器的定义及存在的意义啊!
断水为桥
我是想问,只考虑函数不考虑装饰器,如果我定义一个函数返回值是另一个函数,那应该返回那个函数的引用,这么说对吗
返回顶部
顶部