我正在尝试编写一个继承自mmap的类,如下所示:
from mmap import mmap
class SBFMap(mmap):
def __init__(self, filename):
f=open(filename, 'rb')
fn = f.fileno()
super().__init__(fn, 0, access = mmap.ACCESS_READ)
您可以猜到,我班级的部分功能是隐藏__init__中的文件打开/关闭。然后我尝试得到一个像这样的SBFMap对象:
from SBFMap import SBFMap
filename = "name\of\file"
mymap = SBFMap(filename)
我收到此错误:
File "SBFReader.py", line 22 in <module> main()
File "SBFReader.py", line 7, in main mymap=SBFMap(filename)
TypeError: an integer is required (got type str)
Press any key to continue . . .
看起来不是python调用SBFMap的__init__而是让我在准备好时调用mmap的__init__,python试图调用mmap&#39; s __init__。我该如何解决这个问题?
答案 0 :(得分:0)
因为对象创建涉及两种不同的特殊方法:创建和对象的__new__
以及配置它的__init__
。
通常,Python可变类使用默认的__new__
,它结束调用object.__new__
来创建一个新的python对象并接受任何参数。
但是有些类(特别是不可变的类)会覆盖__new__
。在这种情况下,您必须在您的类中实现一个并从具有预期签名的父类调用一个。
一旦构造了对象,Python最终将为实际对象调用__init__
方法。
你应该这样做:
class SBFMap(mmap):
def __new__(cls, filename):
f=open(filename, 'rb')
fn = f.fileno()
return super().__new__(cls, fn, 0, access = mmap.ACCESS_READ)
但请注意,如果父类要求调用其__init__
方法,您仍然需要在类中实现一个调用具有预期签名的父__init__
的方法。