4

なぜこれが私に始まったのかはわかりませんが、以下に示すように、別のコンテキストマネージャークラスのサブクラスであるコンテキストマネージャー準拠のクラスがある場合。__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?

ありがとう。

4

1 に答える 1

2

一般に、メソッドが何をするかを知ることは不可能かもしれないので__exit__、同じ引数で呼び出します。例外をスローしたい場合は、代わりにその例外をその例外に与え__exit__、例外が返された後に例外を発生させます...しかし、全体として、これは少しハックに聞こえます。より良い方法は、メソッドをオーバーライドせずにメソッド__exit__をオーバーライドするcloseことです (とにかくスーパークラスによって呼び出されるという事実に依存しています)。または、これら 2 つのコンテキスト マネージャーが実際に異なることを行う場合は、それらをチェーンします。

于 2013-09-25T17:13:24.613 に答える