为什么我的初始化在继承中没有优先权?

2024-03-29 09:57:28 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在尝试编写一个从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)

您可以猜到,我的类的部分功能是将文件打开/关闭隐藏在我的初始化中。然后我尝试得到一个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,而是尝试调用mmap的init。我该怎么解决这个问题?你知道吗


Tags: infrompyimportinitmainlinefilename
1条回答
网友
1楼 · 发布于 2024-03-29 09:57:28

因为在对象创建中有两种不同的特殊方法:__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__并带有预期签名的方法。你知道吗

相关问题 更多 >