我仍然用OOP找到了我的脚,我对如何进行设计感到困惑。我有一些文件。他们都有标题,他们都有数据。有几种(25个左右)文件类型。每种文件类型都有:名称,标题类型,数据格式和数据读取器(即我将编写的用于读取特定文件类型数据的方法)。一个特殊的数据阅读器"可能会从多种文件类型中读取数据。
最终,我需要数据集。数据集具有以上所有属性以及:从源文件读入的所有数据,以及其他一些信息,例如文件名。
就像我说的,我将有25个左右的文件类型,并且一段代码可能会处理几百个数据集。文件类型将非常稳定。随着时间的推移可能会添加更多内容,但现有文件类型的属性几乎不会发生变化,当然也不会在运行过程中发生变化。在数据集中,实际数据可能随处理而变化,但其关联文件类型的属性不会。
处理文件的第一步是读取其标题并找出它所属的文件类型。接下来,将通过调用数据读取器来构建适当文件类型的数据集。
现在,我陷入了将文件类型属性导入数据集的最佳方法。说一个数据集是一个"文件类型"是否更可行?让数据集继承(或只是简单地实例化)文件类型,或者更好地说数据集具有文件类型并让文件类型成为数据集属性?我必须在python中这样做。在回答这个问题时是否有任何特定于python的注意事项。谢谢你的帮助。
答案 0 :(得分:1)
如果我理解正确,我会做这样的事情:
class DataReader: #Your base for all readers
@classmethod
def read (_, file): pass #magic happens here
class DataReaders:
def __init__ (self):
self.__readers = # something like {FileType1: reader1, FileType2: reader1, FileType3: reader3}
def __getitem__ (self, fileType): return self.__readers [fileType]
class DataSet:
def __init__ (self, file, readers):
self.__file = file
self.readFileType ()
self.data = readers [self.__fileType].read (file)
def readFileType (self):
self.__fileType = #parse the header of the file or whatever
readers = DataReaders ()
ds1 = DataSet (file1, readers)
ds2 = DataSet (file2, readers)
答案 1 :(得分:1)
如果我理解正确,您有多种类型的文件或不同的文件格式。这些文件具有数据集,并且这些数据集的格式不是特定于给定类型的。
在这种情况下,我会有一个类来推断文件类型并推断数据格式。一旦推断出文件类型和文件格式,您就可以创建适当的文件类型和数据格式对象。
class Detector(object):
@classmethod
def detect(cls, filename):
"""Return a file object"""
pass
@classmethod
def infer_filetype(cls, header):
pass
@classmethod
def infer_data_format(cls, contents):
pass
class File(object):
def __init__(self, reader)
pass
def data(self):
pass
...
# Other attributes.
class Reader(object)
"""An iterable to read the contents"""