Pythonでのクラスのコンストラクタや__init__関数について分かりやすく解説する

スポンサーリンク

Pythonクラスのコンストラクタ関数の仕事は、クラスのインスタンスを初期化することです。

この記事では、Pythonのクラスのコンストラクタについて解説していきます。

スポンサーリンク

Python クラスのコンストラクタの例

コンストラクター関数を様々な場面で使用する例を見てみましょう。

コンストラクタのないクラス



コンストラクタを定義しないクラスを作成することができます

この場合、クラスのインスタンスを初期化するためにスーパークラスのコンストラクタが呼び出されます。

オブジェクトクラスはPythonのすべてのクラスのベースです。

class Data:
    pass

d = Data()

print(type(d))

以下は、サブクラスのインスタンスを初期化するためにスーパークラスのコンストラクタが呼び出されることを確認するための別の例を示します。

class BaseData:
    def __init__(self, i):
        print(f'BaseData Constructor with argument {i}')
        self.id = i

class Data(BaseData):
    pass

d = Data(10)
print(type(d))

結果は以下の通りです

BaseData Constructor with argument 10

引数なしのシンプルなコンストラクタ


引数のないコンストラクタを作成することができます

クラスのインスタンスの数を数えるなど、ログを取るのに便利です。

class Data1:
    count = 0

    def __init__(self):
        print('Data1 Constructor')
        Data1.count += 1

d1 = Data1()
d2 = Data1()
print("Data1 Object Count =", Data1.count)

結果は以下の通りです。

Data1 Constructor
Data1 Constructor
Data1 Object Count = 2

引数付きのクラスのコンストラクタについて

ほとんどの場合、コンストラクタ関数にはいくつかの引数が含まれています。

これらの引数は、一般にインスタンス変数を初期化するために使用されます。

class Data2:
    def__init__(self, i, n):
        print('Data2 Constructor')
        self.id = i
        self.name = n

d2 = Data2(10 ,'Secret')
print(f'Data ID is {d2.id} and Name is {d2.name}')

結果は以下の通りです。

Data2 Constructor
Data ID is 10 and Name is Secret

継承を伴うクラスコンストラクタ

Pythonでは継承を伴うクラスのコンストラクタもできます。

super() 関数を使って、スーパークラスのコンストラクタ関数を呼び出すことができます。

また、スーパークラスの名前を使用して、その init() メソッドを呼び出すこともできます。

class Person:
    def __init__(self, n):
        print('Person Constructor')
        self.name = n

class Employee(Person):
    def__init__(self, i, n):
        print('Employee Constructor')
        super().__init__(n)
        self.id = i

emp = Employee(99 ,'Pankaj')
print(f'Employee ID is {emp.id} and Name is {emp.name}')

結果は以下の通りです。

Employee Constructor
Person Constructor
Employee ID is 99 and Name is Pankaj

マルチレベル継承によるコンストラクタのチェーン化

class A:
          def __init__(self, a):
            print('A Constructor')
            self.var_a = a
class B(A):
          def __init__(self, a, b):
            super().__init__(a)
            print('B Constructor')
            self.var_b = b
class C(B):
          def __init__(self, a, b, c):
            super().__init__(a, b)
            print('C Constructor')
            self.var_c = c

c_obj = C(1 , 2 , 3)
print(f'c_obj var_a={c_obj.var_a}, var_b={c_obj.var_b}, var_c={c_obj.var_c}')

結果は以下の通りです。

A Constructor
B Constructor
C Constructor
c_obj var_a = 1 , var_b = 2 , var_c = 3

6. 多重継承のあるコンストラクタ

多重継承の場合、super()を使ってすべてのスーパークラスにアクセスすることはできません。

スーパークラスのコンストラクタ関数を、そのクラス名を使って呼び出すのがよい方法です。

class A1:
          def __init__(self, a1):
            print('A1 Constructor')
            self.var_a1 = a1
class B1:
          def__init__(self, b1):
            print('B1 Constructor')
            self.var_b1 = b1
class C1(A1, B1):
          def__init__(self, a1, b1, c1):
            print('C1 Constructor')
            A1.__init__(self, a1)
            B1.__init__(self, b1)
            self.var_c1 = c1

c_obj = C1(1 , 2 , 3)
print(f'c_obj var_a={c_obj.var_a1}, var_b={c_obj.var_b1}, var_c={c_obj.var_c1}')

結果は以下の通りです。

C1 Constructor
A1 Constructor
B1 Constructor
c_obj var_a = 1 , var_b = 2 , var_c = 3

Pythonは複数のコンストラクタを定義するとどうなるか?

PythonはJavaのような他の一般的なオブジェクト指向プログラミング言語と異なり、複数のコンストラクタをサポートしていません

もし複数のメソッドを定義した場合、最後に定義したメソッドがそれ以前に定義したメソッドを上書きします。

class D:
          def__init__(self, x):
            print(f'Constructor 1 with argument {x}')

          def __init__(self, x, y):
            print(f'Constructor 1 with arguments {x}, {y}')
d1 = D(10 , 20)

上記のコードの場合だと、def __init__(self, x, y):の部分がコンストラクタとして適用されます。

タイトルとURLをコピーしました