Select Language

AI Technology Community

7.2、Python_init_()と_del_()関数の使い方

__init__()(以降、初期化関数と呼びます)は、インスタンスオブジェクトを初期化するために使用されます。インスタンスオブジェクトを作成するたびに、そのクラスの初期化関数が呼び出されます。

この初期化関数では、インスタンスオブジェクトを初期化したり、クラスの特定の属性を更新したりすることができます。例えば、そのクラスから作成されたインスタンスオブジェクトの数を更新することができます。初期化関数は引数を持つこともでき、異なる引数を使用して異なるインスタンスオブジェクトを作成することができます。

初期化関数の形式は以下の通りです:

__init__(self, 引数リスト)


以下に、他の引数を持たない初期化関数を定義します:

>>> class Student:                    # クラスStudentを定義
...     version = "1.0"               # クラス属性
...     author = "python.cn"
...     def __init__(self):           # コンストラクタ関数
...         print("__init__() is Running")
...
>>> student_a = Student()             # オブジェクトを作成
__init__() is Running


C++ と Java では、複数の初期化関数を持つことができ、異なる引数の数や異なる引数の型によって異なる初期化関数を選択することができます。しかし、Python で複数の初期化関数を定義することは意味がありません。なぜなら、最終的には 1 つの初期化関数のみが有効になり、最後に定義された初期化関数がすべての前に定義された初期化関数を上書きするからです。

>>> class Student:
...     version = "1.0"
...     author = "python.cn"
...     def __init__(self):             # 最初に定義されたが、上書きされる
...         print("__init__() is Running")
...     def __init__(self, age):        # 2 回目に定義された、有効な初期化関数
...         print("__init__(age) is Running")
...                                     # クラス定義終了
>>> Student.__init__
<function Student.__init__ at 0x7f0431942e18>
>>> Student()      
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: __init__() missing 1 required positional argument: 'age'
>>> student_a = Student(12)
__init__(age) is Running


__del__()(以降、破棄関数と呼びます)は、オブジェクトが破棄されるときに呼び出されます。この関数には引数を持たせることはできません。一般的には、del() を使用して特定のオブジェクトを明示的に破棄します。破棄関数の定義方法は以下の通りです:

__del__(self)

破棄関数は、自身を表す self 引数のみを持ち、他の引数を持つことはできないことがわかります。以下に、オブジェクトが破棄されるときに破棄関数が呼び出される例を示します。

>>> class Student:               # クラスStudentを定義
...     version = "1.0"
...     author = "python.cn"
...     def __init__(self):                     # 初期化関数
...         print("__init__() is Running")
...     def __del__(self):                      # 破棄関数
...         print("__del__() is Running")
...
        # Studentオブジェクトを作成し、変数student_aに保存
>>> student_a = Student()     
__init__() is Running
>>> del(student_a)               # オブジェクトstudent_aを破棄
__del__() is Running


定義された破棄関数が self 以外の引数を持つ場合、オブジェクトを破棄するときに例外が発生します。以下の例では、破棄関数に引数を持たせた結果、例外が発生します。

>>> class Student:                                     # クラスStudentを定義
...     version = "1.0"
...     author = "python.cn"
...     def __init__(self):                     # 初期化関数
...         print("__init__() is Running")
...     def __del__(self, arg1):        # 破棄関数、2 つの引数を持つ、これは誤り
...         print("__del__() is Running")
...         print("arg1 = " % arg1)
...
>>> student_a = Student()                      # Studentオブジェクトを作成
__init__() is Running  
>>> del(student_a)                                     # オブジェクトを破棄、例外が発生
Exception ignored in: <function Student.__del__ at 0x0000000002E740D0>
TypeError: __del__() missing 1 required positional argument: 'arg1'


以下に、クラスの属性の使い方を示します。このクラスの属性は、現在そのクラスのインスタンスオブジェクトがいくつあるかを記録するために使用されます。初期化関数ではこの値を 1 増やし、破棄関数ではこの値を 1 減らします。

>>> class InstanceNum:                         # クラスInstanceNumを定義
...     instance_num = 0                                # クラス属性、インスタンスオブジェクトの数を記録する
...     def __init__(self)                      :# 初期化関数
...         InstanceNum.instance_num = InstanceNum.instance_num + 1
...         print("init(): Now Instance Number = %d" % InstanceNum.
        instance_num)
...     def __del__(self):              # 破棄関数
...         InstanceNum.instance_num = InstanceNum.instance_num - 1
...         print("del(): Now Instance Number = %d" % InstanceNum.
        instance_num)
...                                                                    # クラス定義終了
>>> inst1 = InstanceNum()                      # 最初のインスタンスを作成
init(): Now Instance Number = 1
>>> inst2 = InstanceNum()                      # 2 番目のインスタンスを作成
init(): Now Instance Number = 2
>>> inst3 = InstanceNum()                      # 3 番目のインスタンスを作成
init(): Now Instance Number = 3
>>> del(inst3)                                         # 3 番目のインスタンスを破棄
del(): Now Instance Number = 2
>>> inst3 = InstanceNum()
init(): Now Instance Number = 3
>>> inst4 = InstanceNum()
init(): Now Instance Number = 4
>>> del(inst1)
del(): Now Instance Number = 3


post
  • 10

    item of content
前の章では、リストや辞書などのPythonの予め定義されたデータ型について説明しました。しかし、自分で新しいタイプを定義したい場合、クラスを使用する必要があります。つまり、クラスを使用することで自分だけのデータ型を定義でき、システムで定義された型だけを使う以上のことができます。
クラスはオブジェクト指向プログラミングにおいて非常に基本的な概念であり、最も基本的な機能は新しいデータ型を作成することです。さらに、クラスAから新しいクラスBを派生させることができ、その際クラスBはクラスAのすべての属性を継承します(これを継承機能と呼びます)。
この章では、クラスの定義と使用方法について説明します。具体的には、クラスのプロパティとメソッド、クラスの派生方法、多重継承の使用方法などを解説します。