-decorated基本クラスメソッドの子メソッドの raise NotImplementedError()
内部で実行することもでき@abstractmethod
ます。
測定モジュール(物理デバイス)のファミリー用の制御スクリプトを作成することを想像してみてください。各モジュールの機能は狭く定義されており、1つの専用機能を実装しています。1つはリレーのアレイ、もう1つはマルチチャネルDACまたはADC、もう1つは電流計などです。
使用中の低レベルコマンドの多くは、たとえば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)
リレー:リレーのオン/オフステータスをオンにします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
その通りです。ADCオブジェクトをインスタンス化しようとするとPythonが以下のエラーを発生させるため、実装しないことはオプションではありません。
TypeError: Can't instantiate abstract class 'ADC' with abstract methods 'set'
したがって、他の2つのモジュールで共有される強制動詞(別名 '@abstractmethod')を作成しset
たため、何かを実装する必要がありますが、同時に、この特定のモジュールにとって意味がないため、何も実装
しないでください。set
レスキューへのNotImplementedError
次のようにADCクラスを完了することによって:
class ADC(Generic):
def set(self, channel):
raise NotImplementedError("Can't use 'set' on an ADC!")
あなたは一度に3つの非常に良いことをしています:
- このモジュールに実装されていない(そして実装されるべきではない!)コマンド( 'set')を誤って発行することからユーザーを保護しています。
- あなたは彼らに問題が何であるかを明確に伝えています(これが重要である理由については、「ベア例外」に関するTemporalWolfのリンクを参照してください)
- 強制された動詞
が意味をなす他のすべてのモジュールの実装を保護しています。つまり、これらの動詞が意味をなすモジュールがこれらのメソッドを実装し、他のアドホック名ではなく、これらの動詞を使用して実装することを確認します。