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 인 자 를 추가 하면 클래스 밖의 장식 기 는 클래스 안의 여러 가지 방법 을 직접 사용 할 수 있 고 클래스 의 속성 을 직접 사용 할 수 있 습 니 다.
이 파 이 썬 장식 기 장식 류 를 기반 으로 한 방법 인 스 턴 스 는 바로 소 편 이 여러분 에 게 공유 한 모든 내용 입 니 다.참고 가 되 고 저 희 를 많이 사랑 해 주 셨 으 면 좋 겠 습 니 다.
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 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에 따라 라이센스가 부여됩니다.