4

我不知道为什么这甚至让我恍然大悟,但如果我有一个符合上下文管理器的类,它是另一个上下文管理器类的子类,如下所示。我已经展示了 __exit__ 调用 close() 的“典型”模型。我的问题是:应该 bar.__exit__() 显式调用 super(bar,self).__exit__(args) 还是应该 bar 的 close() 调用 foo 的 close 或???在这种情况下,这里推荐的模型是什么?

class foo(object):
    def __enter__(self):
        pass
    def __exit__(self,*exc_info):
        self.close()
        return False
    def close(self):
      pass
class bar(foo):
    def __enter__(self):
        pass
    def __exit__(self,*exc_info):
        self.close()
        return False
    def close(self):
        super(bar,self).close()   # is this the recommend model?

谢谢。

4

1 回答 1

2

由于在一般情况下可能无法知道该__exit__方法的作用,因此我会使用相同的参数调用它;如果我想抛出一个异常,那么在它的 中给它那个异常__exit__,然后在异常返回后引发它......但总而言之,这听起来有点 hacky;更好的方法可能是你要么不覆盖,__exit__而只是覆盖close方法(依赖于它被超类调用的事实);或链接这两个上下文管理器,如果他们真的做不同的事情。

于 2013-09-25T17:13:24.613 回答