2017-09-11 2 views
0

나는 파이썬 데코레이터를 읽고 매우 유용하다는 것을 알았지 만, 나는 구글과 stackoverflow에서 검색하려고했지만 좋은 대답을 찾을 수 없다는 혼란을 겪고있다. 하나의 질문은 이미 stackoverflow에서 같은 제목으로 질문을 받는다. @wrap 내 질문은 다릅니다왜 우리는 래퍼를 사용하지 않고 데코레이터를 만들 수있을 때 데코레이터에서 래퍼를 사용합니까?

그래서 무엇 기본적인 장식 템플릿은 다음과 같습니다 결과

def deco(x): 
    def wrapper(xx): 
     print("before the deco") 
     x(xx) 
     print("after the deco") 
    return wrapper 


def new_func(a): 
    print("this is new function") 

wow=deco(new_func) 
print(wow(12)) 

:

before the deco 
this is new function 
after the deco 
None 

그래서 때마다 데코는 WRA 전화를 반환 pper 함수, 이제 내가 얻지 못하는 이유는 우리의 주된 목표가 new_func을 매개 변수로 deco 함수에 전달하고 deco 함수에서 해당 매개 변수를 호출 할 때 래퍼를 사용하는 이유입니다. 그러면 래퍼 함수없이 동일한 것을 만들 수 있습니다. :

결과
def deco(x): 
    print("before the deco") 
    a=1 
    x(a) 
    print("after the deco") 




def new_func(r): 
    print("this is new function") 


wow=deco(new_func) 
print(wow) 

:

before the deco 
this is new function 
after the deco 
None 

그래서 장식에 래퍼의 사용은 무엇인가?

+0

'print (와우 (12))'와'print (wow)'의 차이점이 있습니다 ... 두 번째 경우에는 함수를 다시 얻지 못합니다. –

+0

차이가 있습니다. 첫 번째 방법은 함수를 반환하고 두 번째 방법은 아무것도 반환하지 않습니다. 두 번 호출 한 후에'print (type (와우))'를 추가하면 그것을 볼 수 있습니다. – PerunSS

답변

0

여기에 도움이 될 질문이 있습니다. new_func을 이 실제로 전달한 매개 변수를 사용하도록 변경합시다. 예 :

def new_func(r): 
    print("new_func r:", r) 

우리가 new_func에 매개 변수 전달 another_func이 또한 가정 :

def another_func(): 
    new_func(999) 
당신의 질문은

, 어떻게 당신이 deco을 쓸 수를 너무

  • another_func없이 일을 계속 모든 변경 및
  • new_func은 i 값 님께로 전하 셨습니다. another_func

?

관련 문제