应该在python中从子类调用__exit__超类方法

时间:2013-09-25 17:07:28

标签: python subclass exit superclass

我不确定为什么这个甚至恍然大悟,但是如果我有一个上下文管理器兼容类,它是另一个上下文管理器类的子类,如下所示。我已经展示了__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?

感谢。

1 个答案:

答案 0 :(得分:1)

由于在一般情况下可能无法知道__exit__方法的作用,我会用相同的参数来称呼它;如果我想抛出一个异常,那么在它的__exit__中给它那个异常,然后在异常返回之后将其抬起......但总而言之这听起来有点hacky;更好的方法可能是你要么不覆盖__exit__而只是覆盖close方法(依赖于超级类无论如何都要调用它);如果他们真的做了不同的事情,或将这两个情境管理者联系起来。