とりわけ、データ ソースを使用するテスト システムを作成しています。実行中は多数の計測器を読み取りますが、バックエンドのテストと開発のために、ファイルを読み取るか、乱数を返すようにしたいと考えています。将来的には、まだ動作が不明な新しいデータ ソースを作成する必要があることはわかっています。私はシステムをセットアップして、新しい部門に移ることができるようにしようとしていますが、戻ってサポートする必要はありません。そのため、Pythonic のようになり、サプライズをできるだけ少なくしたいと考えています。主な要件は、ソースに対して一貫した API を使用することであり、ここでは ABC が当然の選択のようです。継承元の基本クラスに価値のあるチャンクを含めるには、ソース間に十分な共通点がありません。
何をすべきかを選択する大きなソース モジュールは必要ありません。動作する古いソースをそのままにしておくことができるように、選択可能な小さなスタンドアロン ソースが必要です。問題は、パラメーターで使用するソースを選択できるようにしたいということです。これにより、同じテスト スクリプトを実行してソースを簡単に切り替えることができます。どうやって出会ったのか正確には忘れてしまいまし__new__
たが、それは明らかではなく、他の人もほとんど聞いたことがありませんでした。できます。しかし、私がやろうとしていることを行うための明白な、または Pythonic の方法はありますか? 同僚にとってより使い慣れた方法はありますか? 私は現在、メタプログラミングの快適さのレベルよりもわずかに高いレベルで作業していることを指摘しておく必要があります。
from abc import ABCMeta, abstractmethod
import random
class BaseSource:
__metaclass__ = ABCMeta
@abstractmethod
def get(self):
pass
class ManualSrc(BaseSource):
def get(self):
return float(raw_input('gimme a number - '))
class RandomSrc(BaseSource):
def get(self):
return random.random()
class Source(BaseSource):
"""generic Source choice"""
def __new__(BaseSource, choice):
if choice == 0:
return ManualSrc()
elif choice == 1:
return RandomSrc()
else:
raise ValueError('source choice parameter {} not valid'.format(choice))
if __name__ == '__main__':
for use_src in range(4):
print 'using source choice {}'.format(use_src)
src = Source(use_src)
print src.get()