为什么我的__init__没有优先继承?

时间:2016-03-24 14:40:15

标签: python inheritance override python-3.5 method-overriding

我正在尝试编写一个继承自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__。我该如何解决这个问题?

1 个答案:

答案 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__的方法。