-decorated 기본 클래스 메서드 의 자식 메서드 raise NotImplementedError()
내부 에서 수행 할 수도 있습니다 @abstractmethod
.
측정 모듈 (물리적 장치) 제품군에 대한 제어 스크립트를 작성한다고 상상해보십시오. 각 모듈의 기능은 좁게 정의되어 하나의 전용 기능 만 구현합니다. 하나는 릴레이 어레이, 다른 하나는 다중 채널 DAC 또는 ADC, 다른 하나는 전류계 등일 수 있습니다.
사용중인 대부분의 저수준 명령은 모듈간에 공유되어 ID 번호를 읽거나 명령을 보냅니다. 이 시점에서 우리가 가진 것을 보자 :
기본 클래스
from abc import ABC, abstractmethod
class Generic(ABC):
''' Base class for all measurement modules. '''
def __init__(self):
def _read_ID(self):
def _send_command(self, value):
공유 동사
그런 다음 모듈 별 명령 동사의 상당 부분과 그에 따른 인터페이스의 논리도 공유된다는 것을 알게됩니다. 다음은 여러 대상 모듈을 고려할 때 의미가 자명 한 3 가지 동사입니다.
get(channel)
릴레이 : 릴레이 의 on / off 상태를 가져옵니다.channel
DAC : 얻가 출력 전압에를channel
ADC : 얻가 입력 전압에를channel
enable(channel)
릴레이 : 릴레이 사용 활성화channel
DAC : 출력 채널 사용 활성화channel
ADC : 입력 채널 사용 활성화channel
set(channel)
릴레이 : 릴레이 channel
켜기 / 끄기 설정
DAC : 설정된 출력 전압 온channel
ADC : 음 ... 논리적으로 떠오르는 것은 없습니다 .
공유 동사가 강제 동사가 됨
위의 동사가 각 모듈에 대해 그 의미가 분명하다는 것을 알기 때문에 모듈 전체에서 공유되는 강력한 사례가 있다고 주장합니다. 다음 Generic
과 같이 기본 클래스를 계속 작성합니다 .
class Generic(ABC):
@abstractmethod
def get(self, channel):
pass
@abstractmethod
def enable(self, channel):
pass
@abstractmethod
def set(self, channel):
pass
하위 클래스
이제 우리는 서브 클래스가 모두 이러한 메서드를 정의해야한다는 것을 알고 있습니다. ADC 모듈의 모습을 살펴 보겠습니다.
class ADC(Generic):
def __init__(self):
super().__init__()
def get(self, channel):
def enable(self, channel):
이제 궁금 할 것입니다.
그러나 이것은 위에서 본 것처럼 ADC 모듈 에서는 작동하지 않습니다 set
.
맞습니다 : 구현 set
하지 않는 것은 Python이 ADC 개체를 인스턴스화하려고 할 때 아래 오류를 발생시키기 때문에 옵션이 아닙니다.
TypeError: Can't instantiate abstract class 'ADC' with abstract methods 'set'
따라서 다른 두 모듈에서 공유 set
하는 강제 동사 ( '@abstractmethod'라고도 함)를 만들었 기 때문에 무언가를 구현해야 하지만 동시에이 set
특정 모듈에 대해 의미가없는 것은 구현
하지 않아야합니다.
구조에 NotImplementedError
다음과 같이 ADC 클래스를 완료하면 :
class ADC(Generic):
def set(self, channel):
raise NotImplementedError("Can't use 'set' on an ADC!")
한 번에 세 가지 좋은 일을하고 있습니다.
- 이 모듈에 대해 구현되어서는 안되는 명령 ( 'set')을 잘못 실행하지 못하도록 사용자를 보호하고 있습니다.
- 문제가 무엇인지 명시 적으로 말하고 있습니다 (이것이 중요한 이유는 '베어 예외'에 대한 TemporalWolf의 링크 참조).
- 강제 동사
가 의미가 있는 다른 모든 모듈의 구현을 보호하고 있습니다. 즉, 이러한 동사 가 의미가 있는 모듈 이 이러한 메서드를 구현 하고 다른 임시 이름이 아닌 이 동사를 정확히 사용하여 수행하는지 확인 합니다.