Python 在init中使用contextmanager
在下面的代码中,我不明白为什么MyFileIO2中带有super.\uuuuu init\uuu*args,**kwargs:line抛出了一个关于missing uuu exit\uuuuu的错误,而MyFileIO类的一切工作都很好。我真的不明白在init内部和外部执行的区别到底是什么。有人能告诉我这里发生了什么事吗Python 在init中使用contextmanager,python,python-3.x,class,python-3.5,contextmanager,Python,Python 3.x,Class,Python 3.5,Contextmanager,在下面的代码中,我不明白为什么MyFileIO2中带有super.\uuuuu init\uuu*args,**kwargs:line抛出了一个关于missing uuu exit\uuuuu的错误,而MyFileIO类的一切工作都很好。我真的不明白在init内部和外部执行的区别到底是什么。有人能告诉我这里发生了什么事吗 import io class MyFileIO(io.FileIO): def __init__(self, *args, **kwargs): s
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')
您需要在self上调用上下文管理器,因为uuu init_uuuu实际上不会返回任何内容
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
为了进行测试,我创建了一个二进制文件,其内容为helloworld
_ = MyFileIO2(path, 'rb')
# First byte of file: b'h'
所发生的是super的返回值。\uuuu init\uuuuuu正在通过上下文管理器传递,因此您实际上有:
with None:
pass
AttributeError: __enter__
上下文管理器尝试在非类型对象上调用_enter _uu方法,但这是一个无效的操作。我认为这会引发AttributeError:_enter__