2013-02-27 4 views
1
def decorator(func): 
    def wrapper(func): 
    do something before 
    func() 
    do something later 

    return wrapper 

func = decorator (func) ----> 이것은 내 decoarated 함수입니다. func()는 장식 된 내용을 처리하고 출력을 제공합니다.래퍼 메서드의 의미는 무엇입니까?

단순히 장식하지 않는 이유는 무엇입니까? 내가 볼 수

def decorator(func): 

    do something before 
    func() 
    do something later 

decorator(func) 

유일한 장점은 하나의 경우에 내가 할당하고 다시 사용하기 위해 FUNC 개체를 얻을 수 있다는 것입니다. 질문이 다소 모호한 것 같지만, 목적을 꾸미기 만한다면 함수 객체를 반환해야하는 이유는 무엇입니까? 나는 이점이 무엇을 의미합니까?

+0

"장식 만 하시겠습니까?"는 의미는 무엇입니까? – BrenBarn

+0

이 질문은 함수와 변수가 파이썬에서 어떻게 이루어지는 지와도 밀접한 관련이 있습니다. 장식함으로써 나는 전후에 어떤 것을 의미합니다. – Nishant

답변

3

이 있으면 둘 이상의 장소에서 데코 레이팅 된 기능을 사용하려는 경우 재사용 할 함수 개체를 반환 할 수 있습니다.

두 번째 예에서는 decorator(func)을 호출하면 func가 호출됩니다. 즉, 데코레이터 동작 (예 : '이전의 무언가'및 '이후 무언가')을 원할 경우 매번 decorator(func) 번으로 전화해야합니다.

데코레이터의 요점은 func = decorator(func)을 효과적으로 수행 한 다음에 언제든지 func이라고 호출하면 데코레이터 동작을 자동으로 호출하는 것입니다.

+0

완벽하고 재사용 가능한 단어입니다. 명명 된 객체로 범위 안에 넣기 때문에 다시 사용할 수 있습니다. – Nishant

1

데코레이터 구문의 의미를 고려하십시오. 이 :

@decorator 
def say_hi(): 
    print "Hello!" 

이에 대한 문법 설탕입니다 :

def say_hi(): 
    print "Hello!" 
say_hi = decorator(say_hi) 

그래서, 데코레이터는 기본적으로 함수에 소요, 새로운, 수정 기능을 반환합니다. 다른 말로하면 장식하기 전에 say_hi은 함수입니다. 이후에도 여전히 수정 된 기능이지만 여전히 기능입니다.

데코레이터는 다음과 같이 기록 된 경우 대신

def decorator(fn): 
    return "Something else" 

그런 다음, 장식하기 전에, say_hi 함수 겠지만, 이후,이 값이 "뭔가 다른"(문자열) 것 - 그리고 이제 더 이상 호출 할 수 없습니다!

+0

오른쪽 명령을 실행하지 않고 매혹적인 명령 세트를 반환하는 경우에 대비하여 말할 수 있습니다. 다른 쪽에서는 계산 된 결과를 반환합니다. – Nishant

관련 문제