다음 글에서는 파이썬 데코레이터가 무엇인지 알아보겠습니다. Python 데코레이터와 사용법에 대해 알아보세요. 좋아요, 더 이상 고민하지 말고 다음 기사를 시작하겠습니다.
python decorator
간단히 말하면 python decorator은 원래 함수 A의 기능을 확장하는 데 사용됩니다. 이 함수의 특별한 점은 반환 값도 함수라는 것입니다. Python 데코레이터를 사용하면 원래 함수의 코드를 변경하지 않고 함수에 새 함수를 추가할 수 있다는 것입니다.
함수도 객체이고, 함수 객체에 변수를 할당할 수 있으므로 변수를 통해서도 함수를 호출할 수 있습니다.
>>> def now(): ... print('2015-3-25') ... >>> f = now >>> f() 2015-3-25
함수 개체에는 함수 이름을 가져올 수 있는 __name__ 속성이 있습니다.
>>> now.__name__ 'now' >>> f.__name__ 'now'
이제, now() 함수의 기능을 향상시키고 싶다고 가정해 보겠습니다. 예를 들어, 함수 호출 전후에 로그를 자동으로 인쇄하지만 now() 함수의 정의를 수정하고 싶지는 않습니다. 코드가 실행되는 동안 동적으로 함수를 추가하는 이 방법을 "데코레이터"라고 합니다.
기본적으로 데코레이터는 함수를 반환하는 고차 함수입니다. 따라서 로그를 인쇄할 수 있는 데코레이터를 정의해야 하며 이는 다음과 같이 정의할 수 있습니다.
def log(func): def wrapper(*args, **kw): print('call %s():' % func.__name__) return func(*args, **kw) return wrapper
위의 로그를 관찰하세요. 데코레이터이기 때문에 함수를 매개 변수로 받아들이고 a를 반환합니다. 기능. 함수 정의에 데코레이터를 배치하려면 Python의 @ 구문을 사용해야 합니다:
@log def now(): print('2015-3-25')
now() 함수를 호출하면 now() 함수 자체가 실행될 뿐만 아니라 now를 실행하기 전에도 실행됩니다. () 함수 로그 한 줄 인쇄:
>>> now() call now(): 2015-3-25
now() 함수 정의에 @log를 배치하는 것은 다음 명령문을 실행하는 것과 같습니다.
now = log(now)
log()는 다음과 같습니다. 데코레이터, 함수 반환, 원래 now() 함수는 여전히 존재하지만 이제 같은 이름의 now 변수가 새 함수를 가리키므로 now()를 호출하면 새 함수, 즉 Wrapper()가 실행됩니다. log() 함수에서 반환된 함수입니다.
wrapper() 함수의 매개변수 정의는 (*args, **kw)입니다. 따라서 래퍼() 함수는 모든 매개변수가 있는 호출을 허용할 수 있습니다. Wrapper() 함수 내에서 로그가 먼저 인쇄된 다음 원래 함수가 호출됩니다.
데코레이터 자체가 매개변수를 전달해야 하는 경우 데코레이터를 반환하는 고차 함수를 작성해야 하며, 이는 작성하기가 더 복잡합니다. 예를 들어, 로그의 텍스트를 사용자 정의하려면:
def log(text): def decorator(func): def wrapper(*args, **kw): print('%s %s():' % (text, func.__name__)) return func(*args, **kw) return wrapper return decorator
이 3계층 중첩 데코레이터의 사용법은 다음과 같습니다.
@log('execute') def now(): print('2015-3-25')
실행 결과는 다음과 같습니다. # 🎜🎜#
>>> now() execute now(): 2015-3-25두 가지 수준의 중첩 데코레이터와 비교하면 세 가지 수준의 중첩 효과는 다음과 같습니다.
>>> now = log('execute')(now)먼저, log('execute')를 분석해 보겠습니다. 실행되고 데코레이터 함수가 반환됩니다. 그런 다음 반환된 함수를 호출하면 매개변수는 now 함수이고 반환 값은 최종적으로 래퍼 함수입니다. 위의 두 가지 데코레이터 정의에는 문제가 없지만 아직 마지막 단계가 남아 있습니다. 함수도 객체라고 말했기 때문에 __name__과 같은 속성이 있지만 데코레이터로 장식된 함수를 보면 해당 함수의 __name__이 원래 'now'에서 'wrapper'로 변경되었습니다.
>>> now.__name__' wrapper'#🎜🎜 #반환된 래퍼() 함수의 이름이 'wrapper'이기 때문에 원래 함수의 __name__ 및 기타 속성을 래퍼() 함수에 복사해야 합니다. 그렇지 않으면 함수 시그니처에 의존하는 일부 코드가 실행됩니다. 문제가 발생했습니다.
Wrapper.__name__ = func.__name__과 같은 코드를 작성할 필요가 없습니다. Python의 내장 functools.wraps가 이를 수행합니다. 따라서 완전한 데코레이터는 다음과 같이 작성됩니다. 🎜🎜#또는 매개변수가 있는 데코레이터의 경우:
import functools def log(func): @functools.wraps(func) def wrapper(*args, **kw) print('call %s():' % func.__name__) return func(*args, **kw) return wrapper
import functools는 functools 모듈을 가져오는 것입니다. 모듈의 개념은 나중에 설명하겠습니다. 이제, 래퍼()를 정의하기 전에 @functools.wraps(func)를 추가하는 것을 기억하세요.
위는 이 글의 내용 전부입니다. 이 글은
python decorator과 관련된 지식을 주로 소개하고 있습니다. 라고 합니다. 이 글에서 제가 설명한 내용이 여러분에게 도움이 되고 파이썬을 더 쉽게 배울 수 있기를 바랍니다.
더 많은 관련 지식을 보려면 PHP 중국어 웹사이트Python 튜토리얼 컬럼을 방문하세요.
위 내용은 Python 데코레이터 정의 및 애플리케이션 예제 설명의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!