0

我仍然在 OOP 中找到自己的立足点,我对如何进行设计感到困惑。我有一些文件。他们都有标题,他们都有数据。有几种(25 种左右)文件类型。每种文件类型都有:名称、标题类型、数据格式和数据读取器(即我将编写的用于读取特定文件类型数据的方法)。特定的“数据阅读器”可能会从多个文件类型中读取数据。

最终,我需要数据集。一个数据集具有上述所有属性以及:从源文件中读取的所有数据,以及一些其他信息,例如文件名。

就像我说的,我将拥有 25 种左右的文件类型,运行代码可能会处理几百个数据集。文件类型将非常稳定。随着时间的推移,可能会添加更多内容,但现有文件类型的属性几乎不会改变,当然也不会在运行过程中改变。在数据集中,实际数据可能会随着处理而改变,但其关联文件类型的属性不会。

处理文件的第一步是读取它的标题并确定它属于什么文件类型。接下来,将通过调用适当文件类型的数据读取器来构造数据集。

现在,我被困在将文件类型属性放入数据集中的最佳方法上。说一个数据集是一个“文件类型”并让数据集继承自(或只是简单地实例化)文件类型会更可行,还是说一个数据集有一个文件类型并让文件类型更好?是数据集属性吗?我必须在 python 中执行此操作。在回答这个问题时是否有任何特定于 python 的注意事项。谢谢你的帮助。

4

2 回答 2

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"""
于 2013-01-24T23:05:13.727 回答
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)
于 2013-01-24T23:02:23.757 回答