为什么我的__init__不优先继承?

Why is my __init__ not taking precedence in inheritance?

我正在尝试编写一个从 mmap 继承的 class,如下所示:

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)

如您所料,我的 class 的部分功能是将文件 opening/closing 隐藏在我的 __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 的 __init__。我该如何解决这个问题?

因为对象创建涉及两种不同的特殊方法:__new__ 创建对象和 __init__ 配置它。

通常 Python 可变 classes 使用默认 __new__ 结束调用 object.__new__ 以创建新的 python 对象并接受任何参数。

但是一些 classes(尤其是不可改变的)会覆盖 __new__。在这种情况下,您 必须 在您的 class 中实现一个,并使用预期的签名从父 class 调用一个。

构建对象后,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)

但是请注意,如果父 class 期望其 __init__ 方法被调用,您仍然必须在 class 中实现一个调用父 __init__ 的方法] 具有预期的签名。