2017-02-03 6 views
1

さまざまな理由から、いくつかのサブファイルを使用して読み書きするクラスがあります。 __init__のオブジェクト属性を初期化する適切な方法は何ですか?ファイルは文字列としてのファイルへのパスなので、私はself.file = 'file'として初期化することを選択しました。これは何らかの理由で私にとって非常に汚いと感じています。これは何らかの慣習に反すると確信しています。私はself.metafile = Noneが普及しているかもしれないと推測していますが、それについては本当にわかりません。ファイルを参照するインスタンス属性を初期化する適切な方法は何ですか?

単純な例(2つのオブジェクト属性ファイルのみで、場合によっては5〜6個のファイルで作業しています)。 (私は、この場合、オブジェクト属性として使用することは絶対に必要ではないことを認識していますが、私が実際に行っている作業で本当に役立つことがわかりました。最初の場所でファイルを初期化する方法について説明します。)

class FileHandler(object): 

    def __init__(self, source, meta): 
     self.source_folder = source 
     self.meta_folder = meta 
     self.metafile = 'file' 
     self.output = 'file' 

    def read_meta(self): 
     meta = glob.glob(self.meta_folder+ '*.csv') 
     for m in meta: 
      self.metafile = m 
      self.read_data() 

    def read_data(self): 
     source = glob.glob(self.source_folder + '*.csv') 
     for src in source: 
      current_file = src.strip('.csv') 
      if current_file == self.metafile.strip('_meta.csv') 
       self.output = current_file + '_output.csv' 
       self.combine_meta() 

    def combine_meta(self): 
     # reads the source data, combines it with metadata and writes out 
     # a neat csv file (to self.output) that can be imported into a database 
+0

Btw、なぜ最後の 'metafile'と' output'を両方のループに格納しますか?いくつかのメタファイルやいくつかの出力がある状況はありますか? – quasoft

+0

はい、いくつかのケースではそれぞれ数十があります。 –

+0

関数のローカル変数として 'metafile'と' output'を残すことができるかもしれません。次に、 'read_data'に' metafile'を引数として渡し、 'metafile'と' output'を 'combine_meta'に渡します。そうすれば、それらを初期化する必要はありません。もちろん、他の方法でも使用しない限り、これはすべて動作します。 – quasoft

答えて

1

はい、一般的に私は、コンストラクタでNoneからmetafileoutputを設定します。

class FileHandler(object): 

    def __init__(self, source, meta): 
     self.source_folder = source 
     self.meta_folder = meta 
     self.metafile = None 
     self.output = None 

.... 

対応するファイルが初期化されているかどうかをテストすることができます。真理をチェックするだけです。例:

if self.metafile: 
    .... 
関連する問題