自定义文件类。这可行吗?

时间:2011-06-30 13:05:00

标签: python

目前我正在阅读和编写二进制文件,并经常调用struct pack / unpack函数。而不是经常写像

struct.unpack("3f", myFile.read(12))

我决定编写一个函数来保存自己的一些输入,所以在我的代码中等同于上面的语句是

my_unpack(myFile, '3f')

my_unpack定义为

struct.unpack(fmt, f.read(struct.calcsize(fmt))

但是,如果我改为编写像

这样的东西,那我就在想什么
myFile.get_float(3)
myFile.get_char(12)
myFile.get_string(20)

我相信它会让它更容易阅读,特别是因为打包和解包的语法对于那些不熟悉它的人来说可能会令人生畏。

这是否足以让我自己的类继承File类以提供一些额外的方法?

3 个答案:

答案 0 :(得分:4)

不要子类。相反,撰写:

class StructReader(object):
    def __init__(self, input_file):
        self.input_file = input_file

    def get_float(self, n):
        fmt = ...
        return struct.unpack(fmt, self.input_file.read(struct.calcsize(fmt)))

    ...

当您进行子类化时,您必须担心命名空间冲突。构图避免了这个问题。

答案 1 :(得分:3)

您要详细说明的概念称为包装器,它实现了Facade设计模式。包装器存在的原因是使父类的调用方法更容易 - 正是你想要做的。我没有看到它的问题。

答案 2 :(得分:2)

总的来说 - 是的,为什么不呢?

但是你为什么要继承File呢?为什么不使用组合/中断依赖?

class BinaryReader(object):
    def __init__(self, source):
        self.source = source

    def read_char(l):
        fmt = str(l) + 'c'
        data = self.source.read(struct.calcsize(fmt))
        return struct.unpack(fmt, data)
    ....