前提・実現したいこと
具体的な内容については書くことができないので少々分かりにくいかもしれませんが,最後まで読んでいただけると幸いです.
・入力ファイルを読み込む.
・読み込んだ結果を変数に格納(ここでは10個の変数があるとします).
・10個の変数をもとに出力ファイルを作成する.
というのがやりたいことです.
当初のプログラム
python
1def load_file(file): 2 """ 3 ファイルを読み込んで,いくつか処理を加えて変数val_1, ..., val_10を返す. 4 """ 5 return val_1, ..., val_10 6 7def make_file(arg_1, arg_2, ..., arg_10): 8 """ 9 受け取った変数をもとにファイルを作成. 10 """ 11 12if __name__ == "__main__": 13 val_1, ..., val_10 = load_file(file_name) 14 make_file(val_1, ..., val_10)
初めはこのようにしていたのですが,
・引数(と戻り値)が多すぎて扱いにくい
・val_1, ..., val_10
をまとめて利用する場面が他にもあり,そのたびに全てを渡すのは面倒かつミスが起こりやすい
と感じたため,次のようにval_1, ..., val_10
をクラスにまとめることにしました.
(実際にはval_1, ..., val_10
のように連番の変数ではなく,データ型もサイズも異なる変数なので,これらをvalues
といったリストに格納することは考えておりません.)
修正後のプログラム
python
1class Values: 2 def __init__(self): 3 """ 4 self.val_1, ..., self.val_10の初期化 5 """ 6 7class FileCreator: 8 def __init__(self, values): 9 self.values = values 10 11 def load_file(self, file): 12 """ 13 上と同様にファイルを読み込んでself.values.val_1, ..., self.values.val_10に値を入れる. 14 """ 15 16 def make_file(self): 17 """ 18 やることは上と同じだが,self.valuesの変数をもとにファイルを作成するので引数が必要ない. 19 """ 20 21if __name__ == "__main__": 22 values = Values() # このvaluesは他の場面でも利用する. 23 file_creator = FileCreator(values) 24 file_creator.load_file(file_name) 25 file_creator.make_file()
疑問
FileCreator
クラスが直接Values
クラスのインスタンスを取り込んでいる以上,Values
クラスの変更がFileCreator
クラスにもろに影響するという状況があると思います.そのため,このような書き方はコードの修正のしやすさという面でよろしくないのでしょうか.
(例えば,val_1
という変数をval_a
に変更した場合,FileCreator
クラス内の全てのself.values.val_1
をself.values.val_a
に変える作業が発生します.)
また,このような状況ではどのようにすべきでしょうか.
自分としては,Values
クラスのインスタンスを渡さず,FileCreator
のメンバ変数としてval_1, ..., val_10
を定義してあげて,以下のような関数をFileCreator
内で定義すればよいかと考えました.こうすればValues
クラス内の変数名に変更があっても,この部分のみの修正で済むと思います.
python
1def make_values(self): 2 values = Value() 3 values.val_1 = self.val_1 4 ... 5 values.val_10 = self.val_10 6 return values
クラスの扱いに関してよくわからないこと多いので,根本的に使い方が間違っていましたらご指摘いただけると幸いです.
大変長くなってしまい申し訳ありません.
お手数おかけしますが,何卒よろしくお願いします.
回答4件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2019/08/18 04:22