python中面向对象的DesignProblem,has-a vs. is-a

时间:2013-01-24 22:48:25

标签: python oop class inheritance

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

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

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

处理文件的第一步是读取其标题并找出它所属的文件类型。接下来,将通过调用数据读取器来构建适当文件类型的数据集。

现在,我陷入了将文件类型属性导入数据集的最佳方法。说一个数据集是一个"文件类型"是否更可行?让数据集继承(或只是简单地实例化)文件类型,或者更好地说数据集具有文件类型并让文件类型成为数据集属性?我必须在python中这样做。在回答这个问题时是否有任何特定于python的注意事项。谢谢你的帮助。

2 个答案:

答案 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"""