파 이 썬 진급 장식 기

4887 단어 python장식 기
함수 도 대상
Python 장식 기 를 이해 하려 면 먼저 Python 에서 함수 도 하나의 대상 이라는 것 을 알 아야 하기 때문에 함 수 를 정의 할 때의 함수 명 을 함수 대상 의 인용 으로 볼 수 있 습 니 다.인용 이 므 로 함 수 를 변수 에 할당 할 수도 있 고 함 수 를 매개 변수 로 전달 하거나 되 돌려 줄 수도 있 습 니 다.동시에 함수 체 에서 도 함 수 를 다시 정의 할 수 있다.
장식 기 본질
단순 함수 의 예 를 만들어 장식 기 가 해 야 할 일 을 복원 할 수 있 습 니 다.

def decorator(func):
  
  def wrap():
    print("Doing someting before executing func()")
    func()
    print("Doing someting after executing func()")

  return wrap


def fun_test():
  print("func")


fun_test = decorator(fun_test)
fun_test()

# Output:
# Doing someting before executing func()
# func
# Doing someting after executing func()
fun_test 가 가리 키 는 함수 의 인용 은 decorator()함수 에 전 달 됩 니 다.
decorator()함수 에서 wrap()자 함 수 를 정의 합 니 다.이 자 함 수 는 func 참조 로 전 달 된 fun 을 호출 합 니 다.test()함수,호출 함수 전후 에 다른 일 을 했 습 니 다.
decorator()함수 가 내부 에서 정 의 된 wrap()함수 인용 을 되 돌려 줍 니 다.
fun_test 는 decorator()가 되 돌아 오 는 함수 인용 을 받 아 새로운 함수 대상 을 가리 키 고 있 습 니 다.
통과 funtest()는 새로운 함 수 를 호출 하여 wrap()함수 의 기능 을 수행 하여 funtest()함수 의 앞 뒤 장식
Python 에서 장식 기 사용 하기
Python 에 서 는@기 호 를 통 해 장식 기 기능 을 편리 하 게 사용 할 수 있 습 니 다.

def decorator(func):
  
  def wrap():
    print("Doing someting before executing func()")
    func()
    print("Doing someting after executing func()")

  return wrap

@decorator
def fun_test():
  print("func")


fun_test()

# Output:
# Doing someting before executing func()
# func
# Doing someting after executing func()
장식의 기능 은 이미 실현 되 었 으 나,이때 실행:
 

print(fun_test.__name__)

# Output:
# wrap
 fun_test.__name__wrap 이 되 었 습 니 다.이것 은 wrap()함수 가 우리 함수 의 이름과 주석 문 서 를 다시 썼 습 니 다.이 문 제 는 funtools.wraps 를 통 해 해결 할 수 있 습 니 다.wraps 는 함수 하 나 를 받 아들 여 장식 하고 함수 이름 복사,주석 문서,매개 변수 목록 등 기능 을 추가 합 니 다.이것 은 장식 기 안에서 장식 전의 함수 속성 에 접근 할 수 있 습 니 다.
보다 규범 화 된 표기 법:

from functools import wraps

def decorator(func):
  @wraps(func)
  def wrap():
    print("Doing someting before executing func()")
    func()
    print("Doing someting after executing func()")

  return wrap


@decorator
def fun_test():
  print("func")


fun_test()
print(fun_test.__name__)

# Output:
# Doing someting before executing func()
# func
# Doing someting after executing func()
# fun_test
매개 변수 장식 기
패키지 함수 의 함 수 를 되 돌려 줍 니 다.wraps 장식 기 를 모방 하여 매개 변수 가 있 는 장식 기 를 만 들 수 있 습 니 다.

from functools import wraps

def loginfo(info='info1'):
  def loginfo_decorator(func):
    @wraps(func)
    def wrap_func(*args, **kwargs):
      print(func.__name__ + ' was called')
      print('info: %s' % info)
      
      return func(*args, **kwargs)
    return wrap_func
  return loginfo_decorator
  
@loginfo()
def func1():
  pass
  
func1()

# Output:
# func1 was called
# info: info1

@loginfo(info='info2')
def func2():
  pass

func2()
# Output:
# func2 was called
# info: info2
장식 류
클래스 를 작성 하 는 방법 을 통 해 장식 기 를 실현 할 수 있 고 장식 기 가 계승 등 대상 을 대상 으로 더욱 실 용적 인 특성 을 가지 게 할 수 있다.
먼저 장식 기 기본 클래스 를 만 듭 니 다:

from functools import wraps

class loginfo:
  def __init__(self, info='info1'):
    self.info = info
    
  def __call__(self, func):
    @wrap
    def wrap_func(*args, **kwargs):
      print(func.__name__ + ' was called')
      print('info: %s' % self.info)
      
      self.after()  #   after  ,        
      return func(*args, **kwargs)
    return wrap_func

  def after(self):
    pass


@loginfo(info='info2')
def func1():
  pass
  
# Output:
# func1 was called
# info: info1
loginfo 클래스 를 계승 하여 장식 기의 기능 을 확장 합 니 다:

class loginfo_after(loginfo):
  def __init__(self, info2='info2', *args, **kwargs):
    self.info2 = info2
    super(loginfo_after, self).__init__(*args, **kwargs)

  def after(self):
    print('after: %s' % self.info2)


@loginfo_after()
def func2():
  pass

func2()
  
# Output:
# func2 was called
# info: info1
# after: info2
이상 의 이 상투적인 Python 진급 장식 기 는 바로 편집장 이 여러분 에 게 공유 한 모든 내용 입 니 다.여러분 에 게 참고 가 되 고 많은 응원 을 바 랍 니 다.

좋은 웹페이지 즐겨찾기