我不确定为什么这个甚至恍然大悟,但是如果我有一个上下文管理器兼容类,它是另一个上下文管理器类的子类,如下所示。我已经展示了__exit__调用close()的“典型”模型。我的问题是:应该吧.__退出__()显式调用super(bar,self).__ exit __(args)或应该bar的close()调用foo的关闭或???在这种情况下,这里推荐的模型是什么?
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?
感谢。
答案 0 :(得分:1)
由于在一般情况下可能无法知道__exit__
方法的作用,我会用相同的参数来称呼它;如果我想抛出一个异常,那么在它的__exit__
中给它那个异常,然后在异常返回之后将其抬起......但总而言之这听起来有点hacky;更好的方法可能是你要么不覆盖__exit__
而只是覆盖close
方法(依赖于超级类无论如何都要调用它);如果他们真的做了不同的事情,或将这两个情境管理者联系起来。