8

在 python 2 中,文件是一个合适的类,所以我写了

class MyFile(file):  
  def floats_from_csv(self):  
    strs = self.read(1000000).split(',')  
    for i in strs:  
      yield float(i)

with MyFile("x.csv", "rt") as x:
  for i in x.floats_from_csv():
    ...

在 python3 中,许多文件替换没有公共构造函数,所以我不能子类化并获取__init__函数。我有一个使用委托的技巧,但它很难看。创建内置 IO 类的子类的批准方法是什么?

4

2 回答 2

4

我要做的是将您的子类型替换为支持任何类似文件的对象的通用类型(如果它有read方法,那就足够了),然后像这样封装它。

class MyCsvHandler():
    def __init__ (self, fileObj):
        self.file = fileObj

    def floatsFromCsv (self):
        strs = self.file.read(1000000).split(',')  
        for i in strs:  
            yield float(i)

with open('x.csv', 'r') as f:
    h = MyCsvHandler(f)
    for i in h.floatsFromCsv():
        # ...

这样,您总是可以用完全不同的东西替换您的文件对象,例如您从网站获得的 IO 对象,或来自其他地方的其他流。

于 2012-10-29T13:55:22.323 回答
0

从您展示的一小段代码来看,我认为子类化不是最好的选择。但是,如果这是您真正想做的,请查看IO 模块

于 2012-10-29T13:42:09.477 回答