问题描述
class myfile(file):
"Wrapper for file object whose read member returns a string buffer"
def __init__ (self,*args):
return file.__init__ (self,*args)
def read(self,size=-1):
return create_string_buffer(file.read(self,size))
它的使用类似于File对象:
self._file = myfile(name,mode,buffering)
self._file.seek(self.si*self.blocksize)
我试图像这样在Python 3中实现它:
class myfile(io.FileIO):
"Wrapper for file object whose read member returns a string buffer"
def __init__(self,name,*args,**kwargs):
super(myfile,self).__init__(name,closefd=True,**kwargs)
def read(self,size=-1):
return create_string_buffer(self.read(size))
问题在于FileIO的构造函数没有采用buffering
参数,而Python抛出了TypeError: fileio() takes at most 3 arguments (4 given)
错误。
Python 3 open function是我所需要的。我可以继承吗?我看过PyFile_FromFd class,但是它需要一个打开的文件描述符,而且我担心其行为会有所不同。
谢谢!
解决方法
您不能从open
继承。缓冲参数更改了返回的类,因此open
被实现为可以返回多个类之一的函数。最好的选择是做同样的事情,必要时使用自己的包装器类。
基本的实现思路是:
-
myfile
是签名类似于open
的函数
- 您有两个类,一个类继承自
FileIO
,一个类继承自BufferedReader
。 - 调用
myfile
时,它会检查buffering
参数,并创建并返回派生的FileIO
子类(无缓冲时)或创建普通的无缓冲FileIO
类open
,然后将其包装在BufferedReader
派生的子类中。
一种快速的解决方案是猴子修补:
def myfile(*args,**kwargs):
f = open(*args,**kwargs)
def read(size=-1):
return create_string_buffer(f._read(size))
f._read = f.read # save old read method
f.read = read # patch
return f