1

C++ プログラムの swig インターフェイス用の Python ラッパーを作成しています。

Python オブジェクトがどのように削除されたかを「知る」方法があるかどうか知りたいです。オブジェクトがガベージ コレクターによって削除された場合、ラッパーは基になる C++ オブジェクトに対して何もしませんが、ユーザーが意図的にオブジェクト (``del オブジェクト) を削除した場合、ラッパーはそれを検出し、参照を解除します。基になるオブジェクトも削除されるようにします。

私はすでにこれについてグーグルで試しましたが、何も見つかりませんでした。私が見つけた唯一のことは、(どうやら)__del__がガベージ コレクターと del コマンドの両方によって呼び出され、どちらが呼び出したかを区別する方法がないように思われることです。

誰かが私が間違っていることを証明してくれることを願っています!

4

1 に答える 1

2

CPython は、参照カウントを使用してオブジェクトの有効期間を追跡します。したがって、すべての削除はガベージ コレクターによって行われます。

たとえば、次のコードは2 つの参照を作成します。オブジェクトへの 2 番目の参照が削除された後、フック__del__1 回だけ呼び出されます。

>>> class Foo(object):
...     def __del__(self):
...         print "Bye bye!"
... 
>>> spam = Foo()
>>> bar = spam
>>> del spam
>>> del bar
Bye bye!

したがって、フックdelを介して個々のステートメントを検出する方法はありません。__del__常にガベージ コレクターによってのみ呼び出されます。

特定の python 実装 (特に cpython)は、循環依存関係の一部であるフックを持つオブジェクトをクリアしないことに注意してください。__del__これはすべての実装に当てはまるわけではありませんが、覚えておく必要があります。

いずれにせよ、オブジェクトの削除とガベージ コレクションを実装するための参照カウントの使用は、それ自体が実装の詳細であり、非 CPython 実装では、オブジェクトの削除をまったく異なる方法で処理できます (実際に行います)。

于 2012-09-22T23:15:54.790 に答える