Python 장식 기 장식 클래스 의 방법 인 스 턴 스 기반

title:Python 장식 기 장식 류 의 방법
comments: true
date: 2017-04-17 20:44:31
tags: ['Python', 'Decorate']
category: ['Python']
---
현재 중국어 인터넷 에서 검색 할 수 있 는 대부분의 장식 기 에 관 한 튜 토리 얼 은 일반적인 함 수 를 어떻게 장식 하 는 지 에 대해 이야기 하고 있다.본 고 는 Python 의 장식 기 를 사용 하여 하나의 종 류 를 장식 하 는 방법 을 소개 하 는 동시에 장식 기 함수 에서 클래스 안의 다른 방법 을 호출 하 는 방법 을 소개 한다.본 고 는 한 방법의 이상 을 포착 하 는 것 을 예 로 들 어 설명 한다.
Test 의 구 조 는 다음 과 같 습 니 다.

class Test(object):
 def __init__(self):
  pass
 def revive(self):
  print('revive from exception.')
  # do something to restore
 def read_value(self):
  print('here I will do something.')
  # do something.
클래스 중 하 나 는 readvalue(),이 방법 은 여러 곳 에서 호출 됩 니 다.어떤 이유 로 방법 readvalue 는 Exception 을 무 작위 로 던 져 프로그램 이 무 너 질 수 있 습 니 다.그래서 모든 방법 에 대해 try..except 처 리 를 해 야 합 니 다.가장 추 한 방법 은 다음 코드 와 같다.

class Test(object):
 def __init__(self):
  pass
 def revive(self):
  print('revive from exception.')
  # do something to restore
 def read_value(self):
  try:
   print('here I will do something.')
   # do something.
  except Exception as e:
   print(f'exception {e} raised, parse exception.')
   # do other thing.
   self.revive()
이렇게 쓰 면 문 제 를 해결 할 수 있 지만 코드 는 Pythonic 이 아 닙 니 다.
장식 기 를 사용 하여 이 문 제 를 해결 합 니 다.장식 기 함 수 는 클래스 안에 써 야 합 니까?아니면 클래스 밖 에 써 야 합 니까?정 답 은 클래스 밖 에 쓰 여 있다.그렇다면 클래스 밖 에 쓴 이상 어떻게 이런 종류의 다른 방법 을 사용 합 니까?
우선 가장 흔히 볼 수 있 는 이상 처리 장식 기 를 작성 하 십시오.

def catch_exception(origin_func):
 def wrapper(*args, **kwargs):
  try:
   u = origin_func(*args, **kwargs)
   return u
  except Exception:
   return 'an Exception raised.'
 return wrapper
class Test(object):
 def __init__(self):
  pass
 def revive(self):
  print('revive from exception.')
  # do something to restore
 @catch_exception
 def read_value(self):
  print('here I will do something.')
  # do something.
이런 서법 은 확실히 origin 을 포착 할 수 있다func()의 이상,그러나 이상 이 발생 할 때 클래스 안의 다른 방법 으로 이상 을 처리 해 야 한다 면 어떻게 해 야 합 니까?정 답 은 wrapper 에 인 자 를 추가 하 는 것 입 니 다:self.
코드 는 다음 과 같은 형식 으로 변 경 됩 니 다.

def catch_exception(origin_func):
 def wrapper(self, *args, **kwargs):
  try:
   u = origin_func(self, *args, **kwargs)
   return u
  except Exception:
   self.revive() #    ,           
   return 'an Exception raised.'
 return wrapper
class Test(object):
 def __init__(self):
  pass
 def revive(self):
  print('revive from exception.')
  # do something to restore
 @catch_exception
 def read_value(self):
  print('here I will do something.')
  # do something.
장식 기 가 정의 하 는 부분 만 수정 하고 장식 기 를 사용 하 는 곳 은 전혀 수정 할 필요 가 없다.
다음 그림 은 정상적으로 실 행 될 때의 운행 결과 입 니 다.

다음 그림 은 이상 발생 후 포획 및 처리 이상:

self 인 자 를 추가 하면 클래스 밖의 장식 기 는 클래스 안의 여러 가지 방법 을 직접 사용 할 수 있 고 클래스 의 속성 을 직접 사용 할 수 있 습 니 다.
이 파 이 썬 장식 기 장식 류 를 기반 으로 한 방법 인 스 턴 스 는 바로 소 편 이 여러분 에 게 공유 한 모든 내용 입 니 다.참고 가 되 고 저 희 를 많이 사랑 해 주 셨 으 면 좋 겠 습 니 다.

좋은 웹페이지 즐겨찾기