2009-06-03 15 views
5

クラスを破棄するときに呼び出される、自分のモジュールに追加できるメソッドはありますか?Pythonのモジュール削除で呼び出されるメソッド

私たちには静的メンバー関数しかなく、モジュールをアンロードするときにデータベース接続をクリーンアップする必要がある単純なクラスがあります。

インスタンスを持たないモジュールまたはクラスに対して__del__メソッドが存在することを望んでいましたか?

+0

「モジュールの削除」とはどういう意味ですか?これはいつ起こると思いますか? –

+0

私たちは静的メンバ関数しか持たず、モジュールをアンロードするときにデータベース接続をクリーンアップする必要のある単純なクラスを持っています。インスタンスを持たないモジュールやクラスのために__del__メソッドがあることを期待していましたか? – Dan

+0

@ダン:新しい情報で質問を更新してください。自分の質問にはコメントしないでください。また、モジュールをアンロードするためのユースケースは何ですか?なぜあなたはこれをやりますか? –

答えて

17

どのクラスを破壊するのですか?私はあなたがモジュールを言ったが?

インタープリタが停止するまでモジュールは存続します。あなたは「atexitを」モジュールを使用して、その時点で実行するために何かを追加することができます。

import atexit 
atexit.register(myfunction) 

EDIT:あなたのコメントに基づいています。

デストラクタとしては望んでいないので、上記の私の答えは正しいです。ちょうど別の関数デフ(または静的メソッド、あなたが希望する場合)とのatexitに登録:あなたの定義について

def close_database(): 
    proceed_to_close() 

import atexit 
atexit.register(close_database) 

今すぐ簡単なメモ。

クラスにはインスタンスがありません。だから、それをクラスにするのはなぜですか?代わりにモジュールレベルで関数を定義してみてはいかがですか?モジュールには、代わりにdatabase.pyを定義する、一度だけキャッシュされ、インポートされたファーストクラスのオブジェクト、...

例です:

class DataBase(object): 
    @staticmethod 
    def execute_some_query(query): 
     code_here() 
     some_code() 
    @staticmethod 
    def close_database(): 
     proceed_to_close() 
import atexit ; atexit.register(DataBase.close_database) 

と使用:

from database import DataBase 
DataBase.execute_some_query(query) 

あなたはdatabase.pyに代わりにこれを行うことができます:

def execute_some_query(query): 
    code_here() 
    some_code() 

def close_database(): 
    proceed_to_close() 
import atexit ; atexit.register(close_database) 

いっそ

import database 
database.execute_some_query(query) 

または::使用sqlalchemyと、独自のデータベースインタフェースを作成するためのすべてのこのトラブルを避けるためです。

-1

は、デルのメソッドを使用します。

class Foo: 

    def __init__(self): 
     print "constructor called." 

    def __del__(self): 
     print "destructor called." 
+0

http://docs.python.org/reference/datamodel.html#object.__del__ –

+1

__init__はコンストラクタではありません。 __del__を使用すると、gcがオブジェクトを収集しない可能性があるので、可能であれば、__del__を避ける方が一般的です。 – DasIch

+0

__init__はコンストラクタではありませんか?私は混乱しています... – ismail

1

あなたが探しているクラスのデストラクタメソッドは__del__あります。呼び出されたときのニュアンス、および例外とサブクラス化が__del__でどのように処理されるべきかについてのニュアンスがありますので、official docsを必ず読んでください。

用語についての簡単なメモ:Pythonでmoduleは、コードが配置されているファイルです...名前空間、本質的には。 1つのモジュールには、多くのクラス、変数、および関数を含めることができます。 __del__メソッドは、クラスではなく、モジュール上にあります。

-1

bpythonを使用してテスト済み...

>>> import atexit 
>>> class Test(object): 
...  @staticmethod 
...  def __cleanup__(): 
...   print("cleanup") 
...  atexit.register(Test.__cleanup__) 
... 
Traceback (most recent call last): 
    File "<input>", line 1, in <module> 
    File "<input>", line 6, in Test 
NameError: name 'Test' is not defined 
+0

'register'呼び出しがインデントされてクラスの一部になりましたが、クラスはまだ存在しません。あなたが受けた答えのさまざまな例とあなたが何をしたのかを比較してください。 – DSM

+0

ああ、ok。私はクラスが現時点では存在しないことを認識しませんでした。 – user2153867

関連する問題