Python 在init中使用contextmanager

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

在下面的代码中,我不明白为什么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):
        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__