4

編集:NPEのコメントのために質問を一般化しました。

Python 2.7.3インタラクティブセッションの場合:

>>> class Foo(object):
...     pass
... 
>>> type("Bar", (Foo,), {})
<class '__main__.Bar'>
>>> Foo.__subclasses__()
[<class '__main__.Bar'>]
>>> 

また:

>>> class Foo(object):
...     pass
... 
>>> class Bar(Foo):
...     pass
... 
>>> Foo.__subclasses__()
[<class '__main__.Bar'>]
>>> del Bar
>>> Foo.__subclasses__()
[<class '__main__.Bar'>]

関数Barを介してまだ利用できるのはなぜですか?__subclasses__ガベージコレクションになると思っていました。

逆に、ガベージコレクションを行いたい場合は、どうすればよいですか?

4

1 に答える 1

7

このスレッドを参照してください。__mro__クラスの属性がそれ自体への参照を格納し、参照サイクルを作成しているように見えます。サイクルを検出してオブジェクトを削除する完全なgc実行を強制できます。

>>> class Foo(object): pass
>>> class Bar(Foo): pass
>>> import gc
>>> del Bar
>>> gc.collect()
3
>>> Foo.__subclasses__()
[]

または、他のコマンドをしばらく入力すると、gcが自動的に実行され、サイクルが収集されます。

これをインタラクティブにテストするときは、少し注意する必要があることに注意してください。インタラクティブインタプリタは、最後に返された値への参照を「最後の値」変数に格納するためです_。サブクラスリストを明示的に調べてすぐに収集しようとすると、_変数はクラスへの強力な参照を持つリストを保持するため、機能しません。

于 2013-01-20T08:49:48.103 に答える