파 이 썬 진급 장식 기
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()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보다 규범 화 된 표기 법:
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
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이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
로마 숫자를 정수로 또는 그 반대로 변환그 중 하나는 로마 숫자를 정수로 변환하는 함수를 만드는 것이었고 두 번째는 그 반대를 수행하는 함수를 만드는 것이었습니다. 문자만 포함합니다'I', 'V', 'X', 'L', 'C', 'D', 'M' ; 문자열이 ...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.