2011-08-22 7 views
1

메소드 hello를 가진 정적 클래스가 있습니다. 안녕하세요 전에 데코레이터 메서드 막대를 실행하고 싶습니다. 그러나, 다음 코드를 사용하면 항상 "name 'bar'가 정의되지 않았습니다."오류가 발생합니다. 아무도 무슨 일이 일어나는지 알아? 감사!파이썬 데코레이터 범위 지정 문제

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() 

합니다.

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

그래서 당신은 당신이 그것을 정의하기 전에 함수를 호출하려고했던 :

@bar 
def hello(): 
    print "hello" 

은 동일합니다 : 이것은이 때문에 문제입니다.