我不确定为什么我突然想到了这一点,但如果我有一个上下文管理器兼容类,它是另一个上下文管理器类的子类,如下所示。我已经展示了 __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?
谢谢。
最佳答案
因为在一般情况下可能无法知道 __exit__
方法的作用,所以我将使用相同的参数调用它;如果我想抛出一个异常,那么在它的 __exit__
中给它那个异常,然后在异常返回后引发它……但总的来说这听起来有点老套;更好的方法可能是您要么不覆盖 __exit__
而是覆盖 close
方法(依赖于它无论如何都会被父类(super class)调用的事实);如果这两个上下文管理器确实做了不同的事情,或者链接它们。
关于python - 应该从python中的子类调用__exit__父类(super class)方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19011111/