Python
 Computer >> コンピューター >  >> プログラミング >> Python

【Python入門】オブジェクトを破棄する方法|__del__()デストラクタの使い方

Pythonでは、クラスに特殊メソッド__del__()(デストラクタ)を実装することで、インスタンスが破棄される直前に自動的に呼び出される処理を定義できます。このメソッドは、ファイルやネットワーク接続など、メモリ以外のリソースの後始末(クリーンアップ)に活用されます。

サンプルコード

次の例では、__del__()デストラクタが、破棄されようとしているインスタンスのクラス名を出力します。

#!/usr/bin/python

class Point:
    def __init__(self, x=0, y=0):
        self.x = x
        self.y = y

    def __del__(self):
        class_name = self.__class__.__name__
        print(class_name, "destroyed")

pt1 = Point()
pt2 = pt1
pt3 = pt1
print(id(pt1), id(pt2), id(pt3))  # オブジェクトのIDを出力
del pt1
del pt2
del pt3

実行結果

上記のコードを実行すると、次のような結果が出力されます。

3083401324 3083401324 3083401324
Point destroyed

コードの解説

  • 参照の共有: pt2とpt3はpt1と同じオブジェクトを代入しているため、id()の出力は3つとも同じ値になります。つまり、実体は1つのオブジェクトだけです。
  • del文の役割: delはオブジェクトそのものを直接削除するのではなく、変数への参照を解除します。参照カウントが0になった時点で、オブジェクトはガベージコレクタによって破棄され、その際に__del__()が呼び出されます。
  • 出力が1回だけの理由: 「Point destroyed」が一度しか表示されないのは、破棄されたのが同一のオブジェクト1つだけだからです。

注意点

__del__()の呼び出しタイミングは、Pythonの実装や循環参照の有無によって変わる場合があります。確実にリソースを解放したいときは、with文によるコンテキストマネージャの利用が推奨されます。また、本記事のコードはPython 3の構文(print関数形式)で記述しています。Python 2では print class_name のようにステートメント形式で記述していました。

  1. Pythonで辞書の中に辞書を定義する方法(ネスト構造の作り方)

    ネストした辞書とはPythonの辞書(dict)オブジェクトはミュータブル(変更可能)です。この特性により、ある辞書オブジェクトを別の辞書の「値」として格納することができます。つまり、キーに関連付けられた値として別の辞書を定義することで、ネストした(入れ子になった)辞書を作成できるのです。ネストした辞書の定義例以下の例では、学生ごとの情報(名前・年齢・科目・GPA)を、それぞれ独立した辞書として保持し、それらを外側の辞書の値にしています。>>> students = { student1: {name: Raaj, age: 23, subjects: [Phy, C

  2. Python関数からJSONオブジェクトを返す方法をわかりやすく解説

    Pythonの関数からJSONオブジェクト(JSON形式の文字列)を返すには、標準ライブラリの json モジュールに含まれる json.dumps() 関数を使用します。この関数は、Pythonの辞書(dict)などのオブジェクトをJSON形式の文字列へ変換(シリアライズ)してくれます。 基本的な例 以下は、Pythonの辞書をJSON文字列に変換して返す関数のシンプルな例です。 import json # Pythonの辞書 a = {name: Sarah, age: 24, isEmployed: True} def retjson(): python2json = jso