2017-01-06 21 views
0

何度もチェックした後、私はその話題に関する一貫性のない情報を見つけました。Python __del__はデストラクタとして動作しませんか?

場合によっては、__init__ and __del__がコンストラクタとデストラクタと同じPythonであることがわかりました。 __init__の場合はこれが当てはまりますが、クラスが作成されたときに呼び出されます。プログラム終了時に__del__が呼び出されることはありません。

その他のケースでは、__del__が悪いことがわかりました。すべてを手作業で明示的に割り当て解除する必要があります。

問題は次のとおりです。これはどちらですか? unittest.TestCaseクラスを使用しているので、__del__を呼び出すと決して呼び出されません。悲しいことに、私はテストを実行する前にプロセスを開始する必要があるため、私はテストを完了したらそれを終了する必要がありますので、涙を落とすことはできません

+0

@DYZ CPythonはガベージコレクションではなく参照カウントを使用しているため、参照がなくなるたびに解放されるものに数えられることがあります。 Pythonの他のバージョンはもちろん、異なる動作をするかもしれません。 –

+0

@MarkRansomあなたは正しいですね。 – DyZ

+0

「__del__を呼び出すと決して呼び出されない」とはどういう意味ですか?どのように呼びますか?このメソッドは(名前が '__'で始まる他のメソッドと同じように)手で呼び出されるべきではありません。オブジェクトへのすべての参照がなくなると、自動的に呼び出されます。特に、 'del'ステートメントを実行するとき。 – DyZ

答えて

3

あなたが見るこの種の動作たとえば__del__が呼び出されない場合は、一種の議論が行われます。

注:del x doesnの
What is the __del__ method, How to call it?
I don't understand this python __del__ behaviour
https://docs.python.org/3/reference/datamodel.html#object.del

私は特にドキュメントからセクションを照らすが見つかりました:私は面白い発見数のソース、両方のSOと__del__ドキュメントに名前を付けるにはx.__del__()を直接呼び出します。前者は、xの参照カウントを1減らし、後者は、xの参照カウントがゼロになったときにのみ呼び出されます。オブジェクトの参照カウントがゼロにならないようにする一般的な状況には、オブジェクト間の循環参照(例えば、二重リンクリストまたは親ポインタと子ポインタを持つツリーデータ構造)例外をキャッチした関数のスタックフレーム上のオブジェクトへの参照(sys.exc_info()に格納されているトレースバック2はスタックフレームを有効にします)。または対話モードで未処理例外を発生させたスタックフレーム上のオブジェクトへの参照(sys.last_tracebackに格納されたトレースバックはスタックフレームを有効にします)。第1の状況は、サイクルを明示的に切断することによってのみ是正することができる。 2番目は、不要なトレースバックオブジェクトへの参照を解放することで解決でき、3番目はsys.last_tracebackにNoneを格納することで解決できます。ガベージである循環参照は、周期ガベージコレクタが有効になっているときに検出され、クリーンアップされます(デフォルトではオンになっています)。このトピックの詳細については、gcモジュールのドキュメントを参照してください。

ように、オブジェクトの参照カウントがゼロに達していないとノートにいくつかの例は、このような状況が起こる可能性があるに記載されていますので、__del__が呼び出されない可能性のあるケースが明らかに存在しています。

+0

参照カウントに関連する部分は本当に面白いです。リンクありがとう –

関連する問題