python decorator 我遇到个问题,帮忙看看

python decorator 我遇到个问题,帮忙看看

我看到书中有个代码如下
1  #!/usr/bin/env python
2
3  from time import ctime, sleep
4
5  def tsfunc(func):
6      def wrappedFunc():
7          print '[%s] %s() called' % (
8              ctime(), func.__name__)
9          return func()
10   return wrappedFunc
11
12 @tsfunc
13 def foo():
14     pass
15
16 foo()
17 sleep(4)
18
19 for i in range(2):
20    sleep(1)
21    foo()
这个运行结果如下
[Sun Mar 19 22:50:28 2006] foo() called
[Sun Mar 19 22:50:33 2006] foo() called
[Sun Mar 19 22:50:34 2006] foo() called
然后我就修改了tsfunc的定义
def tsfunc(func):
      print '[%s] %s() called' %(
              ctime(), func.__name__)
      return func
@fsfunc
def foo():
      pass
foo()
sleep(4)

for i in range(2)
     sleep(1)
     foo()
运行结果如下
[Sun Mar 19 22:50:28 2006] foo() called
for循环里面的foo函数调用没有打印出来任何消息
请问这个是什么原因呢?
因为decorator在使用时,即@fsfunc只会执行一次,以后就是直接使用处理后的函数了。

原来的decorator其实是在tsfunc中又定义了一个函数,然后返回这个函数。而你后来改的没有这一层了,只是直接返回原函数,所以只会执行一次。而@decorator的意思可以理解为:

[Copy to clipboard] [ - ]
CODE:
def decorator:
    ...
@decorator
def func:
    ...

func = decorator(func)

也就是在使用了@decorator会立刻执行的。而原来的例子之所以又创建了一个新的函数,就是为了在每次执行旧函数前多执行一段代码,因此才这么做的。
你的函数
def tsfunc(func):
      print '[%s] %s() called' %(
              ctime(), func.__name__)
      return func   #此处把foo原封不动的返回,foo里面没有print语句,因此执行foo只是执行pass空语句, 你没有对foo做任何改变!!
@fsfunc
def foo():
      pass
恩 好的
理解了 谢谢了
各位高手:

@fsfunc

这条语句是什么意识?

知道了是 Python Decorator  
可能我用的版本太老了, 不支持。

decorator需要2.4版本以上。
谢谢6楼