2017-11-25 2 views
0

우선 제가 아는 사람은 무엇인지 압니다. 나는 작은 부분을 이해하고 싶다. , 지금파이썬 데코레이터는 실제로 어떻게 정의되어 있습니까?

@viking_chorus 
def menu_item(): 
    print("spam") 

def menu_item(): 
    print("spam") 
menu_item = viking_chorus(menu_item) 

의이 website에 대한 설명을 보자 :;

TL DR

is decorator func1 = func2(func1) # True 
is decorator func3 = func2(func1) # ??? 

는의 함수를 장식하는 동일한 두 가지 방법을 설명 Wiki 살펴 보자 특히 섹션에서 데코레이터로 돌아 가기. 이 정의 된 두 가지 기능은 다음과 같습니다

def make_pretty(func): 
    def inner(): 
     print("I got decorated") 
     func() 
    return inner 

def ordinary(): 
    print("I am ordinary") 

는 그리고 저자는 기능을 장식하고 호출

>>> pretty = make_pretty(ordinary) 
>>> pretty() 
I got decorated 
I am ordinary 

우리는 저자가 사용하지 않는 것을 알 수 있습니다

>>> ordinary = make_pretty(ordinary) 

을하는 위키에서 권장하는 방법입니다 (위키가 때때로 잘못 될 수 있음을 알고 있습니다). 그래서 나는이 tutorial에서 가져온 피보나치 수의 기능을 장식하는 마지막 방법을 사용하기로 결정 :

def memoize(f): 
    memo = {} 
    def helper(x): 
     if x not in memo:    
      memo[x] = f(x) 
     return memo[x] 
    return helper 


def fib(n): 
    if n == 0: 
     return 0 
    elif n == 1: 
     return 1 
    else: 
     return fib(n-1) + fib(n-2) 

이 호출 :

>>> fib_element = memoize(fib) 
>>> fib_element(40) 

fib()가 된 것을 의미합니다 내 컴퓨터에 시간이 오래 걸립니다 제대로 장식되지 않았습니다. 실행 시간은 fib(40)과 비슷합니다. 전화는

>>> fib = memoize(fib) 
>>> fib_element = fib # assigned after decoration 
>>> fib(40) 
>>> fib_element(40) 

입니다. 질문은 다음과 같습니다. ordinary 함수를 pretty = make_pretty(ordinary) 지정에 지정한다고 말할 수 있습니까?

+1

기술적으로 데코레이터라는 별개의 객체는 없습니다. 이것은 실제로 함수를 인수로 취하여 다른 함수를 반환하는 (또는 반환 할 것으로 예상되는) 함수입니다. * 특별한 *은 장식 자 기능을 적용하는 간결한 방법을 제공하는 장식 자 * 구문 *입니다. '@foo def bar() : ...'는'def bar() : ...보다 짧습니다. bar = foo (bar)'를 사용하십시오. – chepner

답변

2

fib_element(40)에 대한 첫 번째 호출이 느린 이유는 사용자가 재귀 적으로 꾸미지 않는다는 것입니다. fib 함수는 사용자의 메모를 알지 못합니다. 동일한 요소에서 fib_element을 반복적으로 호출하면 첫 번째 호출이 느려지고 다른 호출은 매우 빠릅니다.

fibfib (두 번째 예제에서는 데코 레이팅 된 함수를 참조하지만 첫 번째 예제에서는 원래 함수)를 호출하므로이 장식 메서드를 사용하여 메모를 사용하면 동일한 이름을 지정해야합니다.

+0

그래서'fib' 함수가 첫 번째 호출 동안 memoization에 대해 알지 못한다면 왜 앞에서 언급 한 것과 같은 인수를 가진 두 번째 호출과 다음 호출이 사전을 사용하고'fib_element (N)'이 빨리 작동합니까? 이것은 '뚱뚱한'이 메모 작성에 대해 알고 있음을 암시합니다. – Benek

+1

'fib '가 이제 memoized'fib'이기 때문에. – L3viathan

+0

사실'fib_element = fib'는 두 개의 이름이 매우 똑같은 기능을 가리키게 만합니다. 그들은 뚜렷한 기능이 아닙니다. –

관련 문제