python装饰器为什么要双层嵌套函数
PHPz
PHPz 2017-04-18 09:41:45
0
6
837

今天学习了一下python的装饰器,比较难理解的是大家举最简单的装饰例子时都是双层嵌套:

但是单层函数,不也能实现装饰功能吗?python把装饰器设置成双层的目的是什么呢?@到底代表什么运作机制。

PHPz
PHPz

学习是最好的投资!

모든 응답(6)
刘奇

위의 여러 전문가가 언급했듯이 데코레이터(@grammar)의 기능은 다음과 같습니다.

으아악

은 다음과 같습니다:

으아악

중국어로 번역하면

@으로 표현되는 함수를 인수로 사용하여 @ 함수를 호출하고, @ 함수로 표현되는 함수명

에 값을 할당합니다.

이 액션은 데코레이션(수정, 확장, 조정, 제한...) 원본 bar과 매우 유사하므로 데코레이터라고 합니다:

정의에 따르면 데코레이터는 다른 함수를 가져와 명시적으로 수정하지 않고 후자 함수의 동작을 확장하는 함수입니다.

는 장식이라고 하지만 실행된 bar은 더 이상 원본 bar과 동일한 사람이 아닙니다. 일반적으로 함수인 새로운 개체를 반환하지만 반환된 것은 전혀 아무것도 아닙니다. foo 으아악

위의 예에서

는 장식이 없을 뿐만 아니라 기능도 파괴하는 foo을 반환하기 때문에 매우 이상한 데코레이터가 되었습니다.None

처음에 제시한 예로 돌아가서:

으아악

귀하의

에는 foo 문이 없습니다. 이는 returnfoo을 반환한다는 의미입니다. 귀하가 작성한 내용은 기본적으로 파괴자입니다(농담입니다). 그것은 None 구문이 작동하는 순간 @ 구문이 실행되기 때문입니다. print하지만

을 호출하려고 하면

이 전혀 함수가 아니고 물론 달성하려는 효과를 재사용할 수 없기 때문에 오류가 발생한다는 것을 알 수 있습니다 func_a func_a

데코레이터는 반드시 로컬 함수나 중첩 함수를 사용할 필요는 없지만 일반적으로 데코레이터가 함수를 반환하도록 하는 것이 매우 중요한 점이라고 생각합니다. 결국 우리는 데코레이팅된 함수를 여전히 함수라고 생각합니다.

수천 개의 데코레이터가 있으며 일부는 실제로 기능 등록과 같은 단일 계층 중첩을 사용할 수 있습니다.

으아악

이 작업은 장식하는 동안 한 번만 처리하면 되기 때문에 함수를 호출할 때마다 등록하고 싶지는 않습니다.

그러나

로그 인쇄

또는 시간 계산 등과 같은 작업의 경우 함수를 호출할 때마다 인쇄하고 계산해야 하기 때문에 여전히 중첩 기술을 사용해야 합니다. 이 함수는 필연적으로 계단식 및 중첩을 생성하는 로컬 함수에 의해 생성됩니다. 또한 두 개 이상의 중첩 수준을 사용할 수 있는 매개 변수가 있는 좀 더 복잡한 데코레이터도 있습니다. 요약

중첩할지 말지는 목적에 따라 다르지만, 장식한 후 함수를 반환해야 한다는 점 꼭 기억해주세요

내가 답변한 질문
: Python-QA

迷茫

제 생각이 꽤 혼란스러울 수도 있습니다. 제 질문은 Python이 이렇게 설계된 이유입니다. 처음에는 간단한 데코레이터와 하나의 함수를 중첩하는 것이 쓸모 없다고 생각했기 때문입니다. 함수 레이어로 충분합니다. 로그, 시간 등을 인쇄합니다. 이것은 Python의 철학이 아닙니다. 하룻밤 동안 생각하고 이해했습니다. 글이 약간 지저분합니다. 이 디자인 패턴의 경이로움에. 역추론 방법은 기본 요구 사항을 명확히 한 다음 역추론하여 각 단계가 왜 그렇게 작성되었는지 이해하는 것입니다.

으아악
Ty80
  1. 데코레이터는 定义执行 단계 대신

    에서 발생합니다.
  2. 데코레이터 함수

    outer를 반환해야 합니다. 被装饰的函数定义调用이 아니라

    을 반환해야 한다는 점에 유의하세요.
아래층의 자세한 설명이 아주 좋습니다.

刘奇

많은 분들이 공유하셨을 텐데요, 저도 이전에 블로그에 글을 쓴 적이 있습니다. 주제가 흥미롭다면 확인해 보세요.

파이썬 데코레이터에 대한 자세한 설명

PHPzhong

으아악

bar = foo(bar)와 동일합니다. 이것만 이해하세요

PHPzhong

2층이 맞습니다. bar에 값을 할당할 때 이미 함수가 실행된 상태입니다.

최신 다운로드
더>
웹 효과
웹사이트 소스 코드
웹사이트 자료
프론트엔드 템플릿