이 액션은 데코레이션(수정, 확장, 조정, 제한...) 원본 bar과 매우 유사하므로 데코레이터라고 합니다:
정의에 따르면 데코레이터는 다른 함수를 가져와 명시적으로 수정하지 않고 후자 함수의 동작을 확장하는 함수입니다.
는 장식이라고 하지만 실행된 bar은 더 이상 원본 bar과 동일한 사람이 아닙니다. 일반적으로 함수인 새로운 개체를 반환하지만 반환된 것은 전혀 아무것도 아닙니다. foo
으아악
위의 예에서
는 장식이 없을 뿐만 아니라 기능도 파괴하는 foo을 반환하기 때문에 매우 이상한 데코레이터가 되었습니다.None
처음에 제시한 예로 돌아가서:
으아악
귀하의
에는 foo 문이 없습니다. 이는 return가 foo을 반환한다는 의미입니다. 귀하가 작성한 내용은 기본적으로 파괴자입니다(농담입니다). 그것은 None 구문이 작동하는 순간 @ 구문이 실행되기 때문입니다.
print하지만
을 호출하려고 하면
이 전혀 함수가 아니고 물론 달성하려는 효과를 재사용할 수 없기 때문에 오류가 발생한다는 것을 알 수 있습니다 func_afunc_a
데코레이터는 반드시 로컬 함수나 중첩 함수를 사용할 필요는 없지만 일반적으로 데코레이터가 함수를 반환하도록 하는 것이 매우 중요한 점이라고 생각합니다. 결국 우리는 데코레이팅된 함수를 여전히 함수라고 생각합니다.
수천 개의 데코레이터가 있으며 일부는 실제로 기능 등록과 같은 단일 계층 중첩을 사용할 수 있습니다.
으아악
이 작업은 장식하는 동안 한 번만 처리하면 되기 때문에 함수를 호출할 때마다 등록하고 싶지는 않습니다.
그러나
로그 인쇄
또는 시간 계산 등과 같은 작업의 경우 함수를 호출할 때마다 인쇄하고 계산해야 하기 때문에 여전히 중첩 기술을 사용해야 합니다. 이 함수는 필연적으로 계단식 및 중첩을 생성하는 로컬 함수에 의해 생성됩니다. 또한 두 개 이상의 중첩 수준을 사용할 수 있는 매개 변수가 있는 좀 더 복잡한 데코레이터도 있습니다.
요약
중첩할지 말지는 목적에 따라 다르지만, 장식한 후 함수를 반환해야 한다는 점 꼭 기억해주세요
제 생각이 꽤 혼란스러울 수도 있습니다. 제 질문은 Python이 이렇게 설계된 이유입니다. 처음에는 간단한 데코레이터와 하나의 함수를 중첩하는 것이 쓸모 없다고 생각했기 때문입니다. 함수 레이어로 충분합니다. 로그, 시간 등을 인쇄합니다. 이것은 Python의 철학이 아닙니다. 하룻밤 동안 생각하고 이해했습니다. 글이 약간 지저분합니다. 이 디자인 패턴의 경이로움에. 역추론 방법은 기본 요구 사항을 명확히 한 다음 역추론하여 각 단계가 왜 그렇게 작성되었는지 이해하는 것입니다.
위의 여러 전문가가 언급했듯이 데코레이터(@grammar)의 기능은 다음과 같습니다.
으아악은 다음과 같습니다:
으아악중국어로 번역하면
에 값을 할당합니다.이 액션은 데코레이션(수정, 확장, 조정, 제한...) 원본
bar
과 매우 유사하므로 데코레이터라고 합니다:는 장식이라고 하지만 실행된
위의 예에서bar
은 더 이상 원본bar
과 동일한 사람이 아닙니다. 일반적으로 함수인 새로운 개체를 반환하지만 반환된 것은 전혀 아무것도 아닙니다.foo
으아악는 장식이 없을 뿐만 아니라 기능도 파괴하는
처음에 제시한 예로 돌아가서:foo
을 반환하기 때문에 매우 이상한 데코레이터가 되었습니다.None
으아악
귀하의에는
을 호출하려고 하면foo
문이 없습니다. 이는return
가foo
을 반환한다는 의미입니다. 귀하가 작성한 내용은 기본적으로 파괴자입니다(농담입니다). 그것은None
구문이 작동하는 순간@
구문이 실행되기 때문입니다.print
하지만이 전혀 함수가 아니고 물론 달성하려는 효과를 재사용할 수 없기 때문에 오류가 발생한다는 것을 알 수 있습니다
데코레이터는 반드시 로컬 함수나 중첩 함수를 사용할 필요는 없지만 일반적으로 데코레이터가 함수를 반환하도록 하는 것이 매우 중요한 점이라고 생각합니다. 결국 우리는 데코레이팅된 함수를 여전히 함수라고 생각합니다.func_a
func_a
수천 개의 데코레이터가 있으며 일부는 실제로 기능 등록과 같은 단일 계층 중첩을 사용할 수 있습니다.
으아악이 작업은 장식하는 동안 한 번만 처리하면 되기 때문에 함수를 호출할 때마다 등록하고 싶지는 않습니다.
그러나
로그 인쇄또는 시간 계산 등과 같은 작업의 경우 함수를 호출할 때마다 인쇄하고 계산해야 하기 때문에 여전히 중첩 기술을 사용해야 합니다. 이 함수는 필연적으로 계단식 및 중첩을 생성하는 로컬 함수에 의해 생성됩니다. 또한 두 개 이상의 중첩 수준을 사용할 수 있는 매개 변수가 있는 좀 더 복잡한 데코레이터도 있습니다. 요약
중첩할지 말지는 목적에 따라 다르지만, 장식한 후 함수를 반환해야 한다는 점 꼭 기억해주세요: Python-QA
제 생각이 꽤 혼란스러울 수도 있습니다. 제 질문은 Python이 이렇게 설계된 이유입니다. 처음에는 간단한 데코레이터와 하나의 함수를 중첩하는 것이 쓸모 없다고 생각했기 때문입니다. 함수 레이어로 충분합니다. 로그, 시간 등을 인쇄합니다. 이것은 Python의 철학이 아닙니다. 하룻밤 동안 생각하고 이해했습니다. 글이 약간 지저분합니다. 이 디자인 패턴의 경이로움에. 역추론 방법은 기본 요구 사항을 명확히 한 다음 역추론하여 각 단계가 왜 그렇게 작성되었는지 이해하는 것입니다.
으아악데코레이터는
에서 발생합니다.定义
执行
단계 대신는
을 반환해야 한다는 점에 유의하세요.outer
를 반환해야 합니다.被装饰的函数
定义
调用
이 아니라많은 분들이 공유하셨을 텐데요, 저도 이전에 블로그에 글을 쓴 적이 있습니다. 주제가 흥미롭다면 확인해 보세요.
파이썬 데코레이터에 대한 자세한 설명
으아악
bar = foo(bar)와 동일합니다. 이것만 이해하세요
2층이 맞습니다. bar에 값을 할당할 때 이미 함수가 실행된 상태입니다.