2017-01-29 8 views
2

私はいくつかのライブラリを継承するクラスを作成しています。親を呼び出さずにデストラクタをオーバーライドする

このクラスでは、デストラクタをオーバーライドしていますので、特定の方法でクリーニングを行う関数を呼び出すことができます。私がsuper().__ del __()と呼ぶのでなければ、クラスが破壊されたときにリソースが掃除されるということになりますか?このコードがメモリリークを引き起こす可能性はありますか?

class foo(some_library): 
    ... 

    def __del__(self): 
     self.proprietary_cleaning_function() 

は、それらが上書きされている方法で、異なる__init__または__del__のような関数であり、__del__後のpythonの仕事でガベージコレクションのメカニズムのでしょうか?

答えて

2

いいえ、Pythonがオブジェクトを完全に削除するように、基本クラスのデストラクタを明示的に呼び出す必要があります。

documentationから:

基底クラスが__del__()メソッド、派生クラスの__del__() メソッドを持っている場合は、いずれかの場合は、明示的にインスタンスの 基底クラスの一部の適切な削除を保証するために、それを呼び出す必要があります。

はまた、あなたのオブジェクトの参照カウントがゼロになると__del__()方法のみと呼ばれているので、ゼロになるから、オブジェクトの参照カウントを防ぐことがいくつかの一般的な状況があることに注意してください、次のとおりです

円形

オブジェクト間の参照(例えば、二重リンクされたリストまたは親ポインタと子ポインタを持つツリーデータ構造 )。 への参照例外をキャッチした関数のスタックフレーム上のオブジェクト (sys.exc_info()に格納されたトレースバックはスタックフレーム を保持します)。または対話モードで 未処理例外を発生させたスタックフレーム上のオブジェクトへの参照( に格納されたトレースバックsys.last_tracebackはスタックフレームを有効にします)。

最初の状況は、 サイクルを明示的に切断することによってのみ解決できます。もう1つは、有用でなくなった トレースバックオブジェクトへの参照を解放することによって解決することができ、3番目はsys.last_tracebackにNoneを格納することによって解決される になります。ガベージである循環参照 は、循環ゴミの コレクタが有効になっていると検出され、クリーンアップされます(デフォルトではオンになっています)。このトピックの詳細については、gcモジュールのドキュメント を参照してください。

+0

親クラスに\ _ \ _ del \ _ \ _メソッドが実装されていない場合と同じですか?つまり、オブジェクトdel? – GLaDOS

+0

@GLaDOSいいえ、親クラスに '__del__'メソッドがない場合。しかし、メソッドが組み込まれている場合は、それを明示的に呼び出す必要があります。 – Kasramvd

関連する問題