python의 길 - 장식기 보충 (wraps 응용 프로그램)

1960 단어 함수편
장식기의 역할:
프로그램자에 대해 말하자면 개방-폐쇄의 원칙을 따르는 전제에서 피장식 대상에 새로운 기능을 추가하기 위한 것이다
사용자에게 있어서 표면적으로 보면 사용 방식은 이전과 변하지 않았다
import time
def timer(func):
      def wrapper(*args,**kwargs):
          start_time = time.time()
          res=func(*args,**kwargs)
          end_time = time.time()
          print(end_time - start_time)
          return res
      return wrapper

@timer
def login():
    time.sleep(1)
    '''
          ...
    :return:   
    '''
    print('    !')
login()

상소 장식기에 대해 로그인 함수를 위한 운행 시간 통계 기능을 추가하였으며, 사용자에게 있어서는login()을 호출하여 이 기능을 촉발하였으나
이 함수의 속성을 볼 때name__,및doc__예를 들면 다음과 같습니다.
print(login.__name__)
print(login.__doc__)

#    :--->
#wrapper
#None

프로그램 논리로 볼 때 이렇습니다. 현재 이 변수 이름login은 wrapper 함수의 메모리 주소를 가리키고 있습니다.
그러면 우리는 wapper 함수에 원login 함수와 같은 속성을 추가하면 된다. 예를 들어 다음과 같다.
import time
def timer(func):
      def wrapper(*args,**kwargs):
          start_time = time.time()
          res=func(*args,**kwargs)
          end_time = time.time()
          print(end_time - start_time)
          return res
      wrapper.__name__ = func.__name__
      wrapper.__doc__  =  func.__doc__
      return wrapper

@timer
def login():
    '''
    sadad
    :return:
    '''
    time.sleep(1)
    print('    !')
login()
print(login.__name__)
print(login.__doc__)

wraps는 모든 교체를 도와줍니다.
import time
from functools import wraps
def timer(func):
      @wraps(func)
      def wrapper(*args,**kwargs):
          start_time = time.time()
          res=func(*args,**kwargs)
          end_time = time.time()
          print(end_time - start_time)
          return res
      return wrapper

@timer
def login():
    '''
    sadad
    :return:
    '''
    time.sleep(1)
    print('    !')
login()
print(login.__name__)
print(login.__doc__)

좋은 웹페이지 즐겨찾기