在下面的代码中,我不明白为什么MyFileIO2中的MyFileIO2行会抛出一个关于缺少__exit__的错误,而MyFileIO类的所有操作都很好。我真的不明白用init的内部或外部来做到底有什么区别。有人能告诉我这是怎么回事吗?
import io
class MyFileIO(io.FileIO):
def __init__(self, *args, **kwargs):
super().__init__(*args, **kwargs)
def __enter__(self, *args, **kwargs):
f = super().__enter__(*args, **kwargs)
print('first byte of file: ', f.read(1))
return f
class MyFileIO2(io.FileIO):
def __enter__(self, *args, **kwargs):
f = super().__enter__(*args, **kwargs)
print('first byte of file: ', f.read(1))
return f
def __init__(self, *args, **kwargs):
with super().__init__(*args, **kwargs): # AttributeError: __exit__
pass
path = 'some_file.bin'
with MyFileIO(path, 'rb'):
pass
MyFileIO2(path, 'rb')发布于 2018-12-24 16:34:48
您需要调用self上的上下文管理器,因为__init__实际上不返回任何内容。
class MyFileIO2(io.FileIO):
def __init__(self, *args, **kwargs):
super().__init__(*args, **kwargs)
with self:
pass
def __enter__(self, *args, **kwargs):
f = super().__enter__(*args, **kwargs)
print('First byte of file: ', f.read(1))
return f
为了进行测试,我创建了一个二进制文件,其内容为"hello world“。
_ = MyFileIO2(path, 'rb')
# First byte of file: b'h'所发生的情况是super().__init__的返回值正通过上下文管理器传递,因此您实际上拥有以下内容:
with None:
pass
AttributeError: __enter__上下文管理器尝试对__enter__对象调用NoneType方法,但这是一个无效的操作。
https://stackoverflow.com/questions/53915733
复制相似问题