2011-08-22 112 views
1

我有一个方法hello的静态类。我想在hello之前运行装饰器方法栏。但是,使用下面的代码我总是会得到一个“名称”栏“未定义”错误。有谁知道发生了什么事?谢谢!Python装饰器范围问题

class foo(): 
    @staticmethod 
    @bar 
    def hello(): 
     print "hello" 

    def bar(fn): 
     def wrapped(): 
      print "bar" 
      return fn() 
     return wrapped 

foo.hello() 

回答

2

因为它尚未定义。另外,这个装饰者根本不应该是一种方法。

def bar(fn): 
    # ... 

class foo(object): 
    @staticmethod 
    @bar 
    def hello(): 
     # ... 

# ... 

此外,不要使用静态方法,除非你真的知道你在做什么。改为使其成为免费功能。

+0

为什么“不要使用静态方法”? – agf

+0

@agf:因为它们基本上没用。类方法在某些情况下很有用,但我无法想象静态方法的用例。这不是Java。 –

+0

只是为了保持组织有条理,如果模块中有多个类。 – agf

2

你可以改变你的代码:

def bar(fn): 
    def wrapped(): 
     print "bar" 
     return fn() 
    return wrapped 
class foo(): 
    @staticmethod 
    @bar 
    def hello(): 
     print "hello" 
foo.hello() 

这是因为你有你怎么称呼它之前定义的函数。这是因为,这是一个问题:

@bar 
def hello(): 
    print "hello" 

等同于:

def hello(): 
    print "hello" 
hello = bar(hello) 

所以,你试图调用的函数,你定义它。