クラスを破棄するときに呼び出される、自分のモジュールに追加できるメソッドはありますか?Pythonのモジュール削除で呼び出されるメソッド
私たちには静的メンバー関数しかなく、モジュールをアンロードするときにデータベース接続をクリーンアップする必要がある単純なクラスがあります。
インスタンスを持たないモジュールまたはクラスに対して__del__
メソッドが存在することを望んでいましたか?
クラスを破棄するときに呼び出される、自分のモジュールに追加できるメソッドはありますか?Pythonのモジュール削除で呼び出されるメソッド
私たちには静的メンバー関数しかなく、モジュールをアンロードするときにデータベース接続をクリーンアップする必要がある単純なクラスがあります。
インスタンスを持たないモジュールまたはクラスに対して__del__
メソッドが存在することを望んでいましたか?
どのクラスを破壊するのですか?私はあなたがモジュールを言ったが?
インタープリタが停止するまでモジュールは存続します。あなたは「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と、独自のデータベースインタフェースを作成するためのすべてのこのトラブルを避けるためです。
は、デルのメソッドを使用します。
class Foo:
def __init__(self):
print "constructor called."
def __del__(self):
print "destructor called."
あなたが探しているクラスのデストラクタメソッドは__del__
あります。呼び出されたときのニュアンス、および例外とサブクラス化が__del__
でどのように処理されるべきかについてのニュアンスがありますので、official docsを必ず読んでください。
用語についての簡単なメモ:Pythonでmodule
は、コードが配置されているファイルです...名前空間、本質的には。 1つのモジュールには、多くのクラス、変数、および関数を含めることができます。 __del__
メソッドは、クラスではなく、モジュール上にあります。
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
'register'呼び出しがインデントされてクラスの一部になりましたが、クラスはまだ存在しません。あなたが受けた答えのさまざまな例とあなたが何をしたのかを比較してください。 – DSM
ああ、ok。私はクラスが現時点では存在しないことを認識しませんでした。 – user2153867
「モジュールの削除」とはどういう意味ですか?これはいつ起こると思いますか? –
私たちは静的メンバ関数しか持たず、モジュールをアンロードするときにデータベース接続をクリーンアップする必要のある単純なクラスを持っています。インスタンスを持たないモジュールやクラスのために__del__メソッドがあることを期待していましたか? – Dan
@ダン:新しい情報で質問を更新してください。自分の質問にはコメントしないでください。また、モジュールをアンロードするためのユースケースは何ですか?なぜあなたはこれをやりますか? –