今回は、Pythonでクラスで用いる「コンストラクタ」について解説していきます。
コンストラクタを一言でいえば、オブジェクトを生成したクラスで、最初に1度だけ呼ばれる関数のことを言います。具体的なコードを見て理解を深めていきましょう。
コンテンツ
無料オンライン相談を活用しよう!
Pythonというプログラミング言語は機械学習の人気の高まりなどもあり、様々なスクールが無料説明会を開催しています。
その中でも「Freeks(フリークス)|業界初!10,780円のサブスク型プログラミングスクール」がオススメです。Pythonを効率よく学びたいという方はまずは適性を知るためにも無料説明会を利用しましょう。
コンストラクタとは
コンストラクタとは、オブジェクトを生成したクラスに対して、最初に一度だけ実行されるメソッド(関数)のことです。
これをプログラムで書くには「__init__」と記述します。Pythonでは、アンダースコア「_」がついている関数は特殊メソッドといいます。
このメソッドでは、主にオブジェクトが扱う変数などの初期化を行います。
ちなみに、メイン関数で使われる「__name__ == “__main__”」もかなり特殊ですよね!
Pythonにおけるコンストラクタの使い方
引数なしのコンストラクタ
まずは、基本的なコンストラクタの記述方法を見ていきましょう。
1 2 3 4 5 6 7 8 |
class Human(): def __init__(self): print("コンストラクタが実行されました。") if __name__ == "__main__": human = Human() # コンストラクタが実行されました。 |
このように、インスタンスを生成した時に自動的にコンストラクタが実行されているのが確認できます。
引数ありのコンストラクタ
次は引数がある場合のコンストラクタの使い方です。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
class Human(): def __init__(self, name, gender): # 変数の初期化 self.name = name self.gender = gender def intro(self): print("{}さんは{}性です。".format(self.name, self.gender)) if __name__ == "__main__": human = Human("田中", "男") human.intro() # 田中さんは男性です。 |
今回の「Human」クラスのコンストラクタには、「name」と「gender」という2つのメンバ変数があります。
そのため、インスタンスを生成する際の引数も2つ設定しましょう。
コンストラクタ内の関数呼び出し
クラス内のメソッドをコンストラクタで呼び出すには「self」を付けることで可能になります。
1 2 3 4 5 6 7 8 9 10 11 12 13 |
class Human(): def __init__(self, name, gender): self.name = name self.gender = gender self.intro() def intro(self): print("{}さんは{}性です。".format(self.name, self.gender)) if __name__ == "__main__": human = Human("田中", "男") # 田中さんは男性です。 |
サブクラスのコンストラクタ
次は継承という考え方が必要です。
継承について詳しく知りたい方は、「【Python入門】初めてのプログラミング(継承2)雇用管理プログラムの作成」で解説しておりますので参考にしていただけると幸いです。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 |
class Human(): def __init__(self, name, gender): self.name = name self.gender = gender def intro(self): print("{}さんは{}性です。".format(self.name, self.gender)) class SuperHuman(Human): def __init__(self, name, gender, attribute): # 継承元「Human」クラスのコンストラクタの利用 super().__init__(name, gender) self.attribute = attribute def super_intro(self): print("{}さんの属性は{}です。".format(self.name, self.attribute)) if __name__ == "__main__": human = Human("田中", "男") human.intro() # 田中さんは男性です。 superhuman = SuperHuman("中田", "女", "戦士") superhuman.super_intro() # 中田さんの属性は戦士です。 superhuman.intro() # 中田さんは女性です。 |
サブクラスのコンストラクタで継承元のコンストラクタを利用しています。この際には、継承元のメソッドを利用するという意味を持つ「super」を記述しましょう。
コンストラクタのオーバーロード
オーバーロードとは、クラス内で引数の数が異なる同じ名前の関数を定義することを言います。この時、引数が全く同じものを定義することはできません。
Pythonは変数の型を決める必要がない一方で、型の判別ができないためオーバーロードという機能はありませんが、プログラムの書き方でそれと同じような機能を作成することが可能です。
ここからはコンストラクタをオーバーロードする方法を解説していきます。
オーバーロードの失敗例
コンストラクタをオーバーロードするために、単純に2つ目の「__init__」を定義してもエラーとなってしまいます。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 |
class Human(): def __init__(self, name, gender): self.name = name self.gender = gender self.intro() def __init__(self, name, gender, attribute): pass def intro(self): print("{}さんは{}性です。".format(self.name, self.gender)) if __name__ == "__main__": human = Human("田中", "男") """ TypeError: __init__() missing 1 required positional argument: 'attribute' """ |
これを解決するには、キーワード引数(デフォルト引数)を設定することで、幅を利かせたインスタンスを生成が可能となります。
キーワード引数を用いた方法
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 |
class Human(): def __init__(self, name = None, attribute = None): self.name = name self.attribute = attribute self.intro() def intro(self): if self.attribute is None: print("初めまして{}です。".format(self.name, self.attribute)) else: print("中田さんの属性は戦士です。".format(self.name, self.attribute)) if __name__ == "__main__": human1 = Human("田中") # 田中さんは男性です。 human2 = Human("中田", "戦士") # 中田さんの属性は戦士です。 |
まとめ
最後まで読んでいただきありがとうございます!
今回は、Pythonのコンストラクタについて詳しく解説いたしました。
キーワード引数(デフォルト引数)を設定することにより、コンストラクタのオーバーロードが可能となることでより柔軟にインスタンスを生成することができるようになりました。
この方法は、メソッドを定義する際にもかなり便利な方法ですのでぜひともマスターしておきたい内容です。
過去の記事では、キーワード引数についても解説していますのでよろしければ参考にしてみてください。
参考:【Python入門】初めてのプログラミング(関数の利用・可変長引数とキーワード引数)
無料の説明会を有効活用しよう!
独学での学習は孤独感を感じやすく挫折してしまう初心者も多いです。また、参考書を購入しても全く読む気にならないという方も多いはずです。
それでも、なんとかPythonの勉強を行い、高スキルなエンジニアを目指したいという方は無料で受けられるオンライン説明会に参加してみることも一つの手です。
Pythonというプログラミング言語は機械学習の人気の高まりなどもあり、様々なスクールが無料説明会を開催しています。
その中でも「Freeks(フリークス)|業界初!10,780円のサブスク型プログラミングスクール」がオススメです。Pythonを効率よく学びたいという方はまずは適性を知るためにも無料説明会を利用しましょう。