【问题标题】:should __exit__ superclass method be called from subclass in python应该从python中的子类调用__exit__超类方法
【发布时间】:2013-10-01 09:51:14
【问题描述】:

我不知道为什么我突然想到了这一点,但是如果我有一个符合上下文管理器的类,它是另一个上下文管理器类的子类,如下所示。我已经展示了__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?

谢谢。

【问题讨论】:

  • 你想让超类的行为生效吗?这取决于您是要替换还是扩展超类行为。

标签: python subclass exit superclass


【解决方案1】:

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

【讨论】:

  • 是的,重写 close() 是最好的方法,但假设你也想在 exit 方法中添加一些东西。我在问是否有人真的看到在子类中有一个 _exit__() 然后调用 super().__exit__()... 我看过很多有 __exit 并且从未找到作为子类的类,因此我无法找到其他作者所做的任何示例。
  • 我想说在子类中使用__exit__ 几乎没有什么好处,因为协议有点复杂
猜你喜欢
  • 1970-01-01
  • 2011-12-08
  • 1970-01-01
  • 2011-10-24
  • 2012-04-18
  • 1970-01-01
相关资源
最近更新 更多