우선 제가 아는 사람은 무엇인지 압니다. 나는 작은 부분을 이해하고 싶다. , 지금파이썬 데코레이터는 실제로 어떻게 정의되어 있습니까?
@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)
지정에 지정한다고 말할 수 있습니까?
기술적으로 데코레이터라는 별개의 객체는 없습니다. 이것은 실제로 함수를 인수로 취하여 다른 함수를 반환하는 (또는 반환 할 것으로 예상되는) 함수입니다. * 특별한 *은 장식 자 기능을 적용하는 간결한 방법을 제공하는 장식 자 * 구문 *입니다. '@foo def bar() : ...'는'def bar() : ...보다 짧습니다. bar = foo (bar)'를 사용하십시오. – chepner