2017-08-11 14 views
0

私はほとんど同じ方法で部分的に初期化する必要があるさまざまなクラスを持っています。 init関数は、入力ファイルパスおよび/またはnumpyデータを入力します。同様の方法で異なるクラスを初期化する

class InertialData1: 
    def __init__(self, file=None, data=None): 
     # --- this is the (almost) common part --- 
     if file is None: 
     self.file = 'Unknown path to file' 
     else: 
     self.file = file 
     assert isinstance(self.file, str) 

     if data is None: 
     self.data = read_logfile(file, 'a_token') 
     else: 
     self.data = data 
     assert isinstance(self.data, np.ndarray) 
     # --- end of the common part --- 

     # Here other stuff different from class to class 

read_logfile()関数(外部関数)のトークンもクラスからクラスに変更されます。

class InertialData2: 
    def __init__(self, file=None, data=None): 
     # here the common code as above, but with 'another_token' instead of 'a_token' 
     # here other stuff 
... 

もちろん、すべてのクラス定義で同じ行を書くことはもちろん不可能です。

可能な解決策。

私はその後、私はこのように、各クラスののinitメソッド内でそれを使用することができ、この

def initialize(file, data, token): 
    if file is None: 
     file = 'Unknown path to file' 
    else: 
     file = file 
    assert isinstance(file, str) 

    if data is None: 
     data = read_logfile(file, token) 
    else: 
     data = data 
    assert isinstance(data, np.ndarray) 
return file, data 

のような外部関数の定義について考えた:

class InertialData1: 
    def __init__(self, file=None, data=None): 
     self.file = file 
     self.data = data 
     self.file, self.data = initialize(self.file, self.data, token='a_token') 

をこの方法では、動作しているようです。私はちょうどそれを行うのに最適な方法ではない、またはpythonicではないと感じている、あなたの答えから何かを学ぶことを願っています:) ありがとう

答えて

1

あなたはDRYクラスの継承を使用して、あなたのコード:

class InertialData: 
    def __init__(self, file=None, data=None): 
    # --- this is the common part --- 
    if file is None: 
     self.file = 'Unknown path to file' 
    else: 
     self.file = file 
    assert isinstance(self.file, str) 

    def init_data(self, token, data): 
    if data is None: 
     self.data = read_logfile(self.file, token) 
    else: 
     self.data = data 
    assert isinstance(self.data, np.ndarray) 

class InertialData1(InertialData): 
    def __init__(self, file=None, data=None): 
    # --- this is the different part --- 
    super().__init__(file=file, data=data); 
    self.init_data('token_a', data) 

お知らせいくつかのこと:

あなたが繰り返し機能を持つ「普通」クラス、InertialDataを行うことができます。その後、すべてのカスタムクラスは共通クラスから継承できます。どのようにクラスInertialData1InertialDataをパラメータとして受け取るかを見てください。 InertialDataから継承するすべてのクラスで

、あなたはsuperを呼び出すことができ、これは、この場合にInertialDataあるスーパークラスの__init__メソッドを呼び出します。

各クラスの異なるトークンを持つデータを初期化するコードのビットは、トークンをパラメータとする関数に引き込まれています。 InertialDataから継承する任意のクラスの関数__init__initialize_data('token_a')を呼び出すことができます。

大文字で始まるようにクラスの名前を変更しました(Pythonの規約と同じように)。

+0

ご返信ありがとうございます。しかし、それはこのように動作していないようです。 TypeError:superはキーワード引数を受け取りません – Robyc

+0

「super」が渡された引数を自動的に再利用することを忘れていました。また、 'data'を' init_data'メソッドに渡す必要があることを認識しました。そのコードも –

+0

'super'だけでも動作していません。 'super().__ init __(file、data)'が動作しています。 しかし、私はこのような基本的なinit関数を呼び出すことをお勧めします。 – Robyc

関連する問題