为什么我的__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__
的方法] 具有预期的签名。
我正在尝试编写一个从 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__
的方法] 具有预期的签名。