如何定义可以与with语句一起使用的Python类?

Kit*_*Kit 4 python

我理解这StringIO就像一个文件对象,鸭子键入你会得到什么open('somefile.txt').

现在我想用StringIOwith语句:

with StringIO('some string') as fh: # fh as in "file handle"
    data = [stuff from stuff in fh.read()]
Run Code Online (Sandbox Code Playgroud)

但Python抱怨该类型StringIO没有__exit__方法.子类化后StringIO:

class MyStringIO(StringIO):
    def __exit__(self):
        self.close()
Run Code Online (Sandbox Code Playgroud)

我现在得到一个关于没有__enter__方法的例外.我该如何定义__enter__方法?Python对可以与with语句一起使用的类有什么期望?

Ric*_*nes 8

您需要编写上下文管理器.如果您不想编写整个协议,可以使用contextlib.contextmanager装饰器简化它.