2013-09-25 110 views
2

我不確定爲什麼這甚至在我看來,但如果我有一個上下文管理器兼容的類是另一個上下文管理器類的子類,如下所示。我已經展示了__exit__調用close()的「典型」模型。我的問題是:應該bar .__退出__()顯式調用super(bar,self).__ exit __(args)或者應該bar的close()調用foo的close或?這種情況下推薦的模式是什麼?應該從python中的子類調用__exit__超類方法

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

你想讓超類的行爲生效嗎?這取決於您是要替換還是擴展超類的行爲。 – BrenBarn

回答

1

因爲在一般情況下可能不可能知道__exit__方法的作用,所以我會用相同的參數來調用它;如果我想拋出一個異常,那麼在異常返回後給它異常,而不是它的__exit__,然後將異常提升......但總的來說,這聽起來有點冒險;更好的方法可能是讓你不重寫__exit__,而只是覆蓋close方法(依賴於它被超類調用的事實);或者如果他們真的做了一些不同的事情,可以鏈接這兩位情境管理者

+0

是的,overidding close()是做這件事的最好方法,但是假設你也想在你的__exit__方法中使用某些東西。我問,如果有人真的在子類中看到__exit __(),然後調用super().__ exit __()...,我看過很多有__exit_的代碼,並且從來沒有找到這是一個子類,所以我可以找到其他作者做的其他例子。 – staggart

+0

我想說,在子類中有一個'__exit__'幾乎沒有什麼好處,因爲協議有點複雜 –

相關問題