>백엔드 개발 >파이썬 튜토리얼 >Python 데코레이터 정의 및 애플리케이션 예제 설명

Python 데코레이터 정의 및 애플리케이션 예제 설명

乌拉乌拉~
乌拉乌拉~원래의
2018-08-22 16:17:371105검색

다음 글에서는 파이썬 데코레이터가 무엇인지 알아보겠습니다. 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 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.