2017-02-03 2 views
1

Так что по разным причинам у меня есть класс, который использует несколько подфайлов для записи и чтения. Мне интересно, как правильно инициализировать атрибут объекта в __init__. Поскольку файлы - это всего лишь путь к файлу в виде строки, я решил инициализировать их как self.file = 'file'. По какой-то причине это кажется мне очень грязным, и я уверен, что это противоречит какой-то конвенции. Я предполагаю, что self.metafile = None может быть популярным соглашением, но на самом деле не уверен в этом.Каков правильный способ инициализации атрибутов экземпляра, относящихся к файлам?

Простой пример (только с двумя файлами атрибутов объектов, в некоторых случаях я работаю с 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' в качестве локальных переменных в функциях. Затем передайте 'metafile' в качестве аргумента в' read_data' и оба 'metafile' и' output' в 'comb_meta'. Таким образом вам не потребуется инициализировать их. Конечно, все это будет работать, если вы не используете их и в других методах. – quasoft

ответ

1

Да, вообще-то я установил бы metafile и output к None в конструкторе.

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: 
    .... 
Смежные вопросы