3

私は__del__()、オブジェクトが間違った内部状態にあるときに削除された場合に備えて、警告ログを書き込むために使用します(それについての怒りはありません)。

del my_objectテストしてみましたが、テストで使っています__del__()が、呼ばれていないようです。

__del__()のリファレンスは、これが発生する可能性のある3つの状況について警告していますが、それらをデバッグする方法についての手がかりは提供していません。

だから...どうやってそれをデバッグするのですか?

4

3 に答える 3

4

__del__直接呼び出したときに が呼び出されていない場合はdel myObject、myObject への未解決の参照が他に少なくとも 1 つあります。オブジェクトをコピーせず、元のオブジェクトへの2番目の参照を保存するだけのリストまたは辞書またはセット(またはおそらくメモ化キャッシュ)にそれを詰め込んだと思います。やっても:

myObject = MyObjectClassWith__del__()
del myObject

__del__クラスの__init__メソッドまたは__new__メソッドが新しいインスタンスをクラスレベルのキャッシュまたは構造に保存する場合、必ずしも を呼び出すとは限りません。

結論:コードを調べるか、他の回答に投稿されたweakrefまたはgcメソッドを使用して、他の参照を確認してください。

于 2011-08-30T12:53:45.967 に答える
4

疑わしいオブジェクト間のすべての参照をweakrefに変更し、提供するコールバックの出力を監視できますweakref.ref

于 2011-08-30T09:31:07.483 に答える
3

さて、 gc に強制的にオブジェクトを収集させることができます。どのオブジェクトがまだオブジェクトへの参照を持っていて、それらがガベージ コレクションされないようにしている可能性があるかを調べたい場合は、 と を試してみてgc.get_referrersくださいgc.get_referents

于 2011-08-30T08:00:03.987 に答える