8

python 2 では file が適切なクラスだったので書きました

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():
        # ...

そうすれば、ファイル オブジェクトをまったく別のものに置き換えることができます。たとえば、Web サイトから取得した IO オブジェクトや、別の場所からのストリームなどです。

于 2012-10-29T13:55:22.323 に答える
0

あなたが示したコードの小さな断片から、サブクラス化が最良の選択肢だとは思いません。ただし、本当にやりたいことがある場合は、IO モジュールを確認してください。

于 2012-10-29T13:42:09.477 に答える