3
回答
python装饰器的一个小问题
注册华为云得mate10,2.9折抢先购!>>>   


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

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

举报
断水为桥
发帖于4年前 3回/290阅
共有3个答案 最后回答: 4年前

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

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

引用来自“Garfielt”的答案

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

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