2016-07-03 3 views
1
내가 최근에 파이썬 장식의 주제를 leant하고, 아래 두 개의 서로 다른 프로그램에 대한 뭔가 이상한 발견

:파이썬 기능 데코레이터 퍼즐

예 1 :

def deco(func): 
    def inner(): 
     print("Running inner") 
    return func 

@deco 
def target(): 
    print("Running target") 

def main(): 
    print("Running main()") 
    target() 

if __name__ == "__main__": 
    main() 

예 2 :

def deco(func): 
    print("Running inner") 
    return func 

@deco 
def target(): 
    print("Running target") 

def main(): 
    print("Running main()") 
    target() 

if __name__ == "__main__": 
    main() 

Example1과 Example2를 실행하면 다음과 같은 두 가지 결과를 얻습니다.

Running main() 
Running target 
예 1에서

및 예 2에서

Running inner 
Running main() 
Running target 

.

Example1에서 "Running inner"가 손실 된 것처럼 보입니다. 왜?

+1

예 1과 예 2의 결과를 섞어 보지 않았습니까? –

+0

실수로 죄송합니다. – CHENLU

답변

4

실행 예 2는 정의 시간에 deco이 실행되고 그 예제에서는 즉시 inner을 인쇄하기 때문에 결과가 나타납니다.

예 1은 inner 기능으로 절대 수행하지 않기 때문에 내부를 인쇄하지 않습니다. 장식가가 inner이 아닌 func이 아닌 곳에 반환되어야합니다. 당신이 장식에서 기대할 수있는 것입니다

Running main() 
Running inner 
Running target 

:이 작업을 수행 할 때

def deco(func): 
    def inner(): 
     print("Running inner") 
     func() 
    return inner # note change here 

, 당신은이 결과를 얻을 것이다 : 및 inner 자체는 FUNC를 호출해야합니다.

+0

이미 func 자체를 반환했기 때문에 내부 함수가 Example1에서 실행되지 않았기 때문에 이미 수정되었습니다. 권리? – CHENLU

+0

예; 아무것도 그것을 부르고있다. –

관련 문제