6

Python にクラスがあるとします。

class A(object):
    def __del__(self):
        print "Del!"

__del__A任意のインスタンスの削除/ガベージ コレクション時に呼び出されます。

クラスに対して同じことを行うことは可能ですか?クラス自体がガベージ コレクションされたときに、いくつかのメソッドを呼び出したいと思います。これは、スクリプトの終了時に行われると想定しています。

ご指摘ありがとうございます。


編集:私が予想したように、誰もが私をこのテクニックの使用から遠ざけようとしています (私はおそらく自分でそのようなコメントをするでしょう:))。

私は次のことをしたい: クリーンアップする必要がある静的メンバーを持つクラスがあります。

class A(object):
    class Meta(type):
        def __new__(mcs, name, bases, attrs):
            attrs['conn'] = sqlite3.connect( DB_FILE )
            return type.__new__(mcs, name, bases, attrs)

    __metaclass__ = Meta

呼び出されたいのですA.conn.close()が、プログラムが終了する直前、つまり のインスタンスAがこれ以上作成されないことがわかっている場合です。でこれを実行できることはわかっていますがatexit、これは非常に醜いようです。

4

1 に答える 1

4

問題は、クラスにそれ自体への循環参照が含まれていることです。したがって、クラスが削除されると、簡単に収集されません。したがって__del__、メタクラスのメソッドodfは呼び出されません。

PypyのPython実装を使用して呼び出されるようにトリガーできますが、cpython(2.6または3.2)は使用しません。そしてそれをトリガーするために、私は手動でガベージコレクターを呼び出さなければなりませんでした-プログラム終了時のPython環境は不整合に満ちていることが知られており__del__、saeを許可するのに十分なクラスの内部情報が存在する間にメソッドが呼び出される可能性がありますシャットダウンは非常にスリムになります。

これが私のPypyセッションで、クラスへの呼び出しをトリガーしました。__del__

 ~]$ pypy                                                                                       
Python 2.5.2 (78826, Nov 29 2010, 00:18:05)                                                                       
[PyPy 1.4.0] on linux2                                                                                            
Type "help", "copyright", "credits" or "license" for more information.                                            
And now for something completely different: ``sorry, I'll teach the cactus how                                    
to swim later''                                                                                                   
>>>> import gc
>>>> class Meta(type):         
....    def __del__(cls):                          
....       print ("Arghh!!")                                              
....                                                                      
>>>> class A(object):                                                                     
....   __metaclass__ = Meta                                                                                     
....                                                                                                                                                                                                                
>>>> del A                                                                                                        
>>>> gc.collect()                                                                                                 
Arghh!!                                                                                                           
0                                                                                                                 
>>>>
于 2011-04-10T03:59:48.407 に答える