Pythonのススメ7
はじめに
Pythonでプログラムを書くにあたり、文法や言語仕様などの個人的なメモを記載する。今回のネタはコンストラクタ。
コンストラクタ(基本)
オブジェクト生成時の初期値を設定するメソッド。例えばJavaでは以下のように書くところを、Pythonで書くとどうなるか。
public class MyClass() { private String msg; public MyClass(String msg) { this.msg = msg; } ... }
答えは以下の通り。
Pythonではメソッドを定義するときにdefを使う。
Pythonではコンストラクタを定義するときは__init__ という特殊関数を使う。
また、その際、自分自身を意味するselfを引数にすることが求められている。これはコンストラクタに限らず、メソッド全般において言えることである。
class MyClass(): def __init__(self, msg): self.msg = msg ...
コンストラクタ(オーバーロード)
コンストラクタは何も1つだけとは限らない。例えばJavaの場合、以下のようにコンストラクタのオーバーロードをする場合もある。
public class MyClass() { private String msg; public MyClass(String msg) { this.msg = msg; } public MyClass() { this("DefaultMessage"); } ... }
これ(と似たようなこと)をPythonで表記しようとしたらどうなるか。
まず前提として、Pythonではメソッドのオーバーロードができない。
つまり、Pythonでは__init__ メソッドは1つのクラスに1つしか定義できない。
ではPythonではオーバーロードのようなことができないのかと言うと、答えはNoである。
以下のように、デフォルト値を定義することでコンストラクタのオーバーロードのような記述が可能。
class MyClass(): def __init__(self, msg = None): self.msg = msg ...
このように記載しておくことで、MyClassオブジェクト生成時に以下のように動作する。
- MyClassオブジェクト生成時に、呼び出し元が何かしらの引数を渡していれば、それが変数msgに代入される。
- MyClassオブジェクト生成時に、呼び出し元が引数が渡されていない場合は、変数msgはNoneになる。
具体的なソースコードの例を次の章で記載する。
サンプルプログラム
これまでの内容を踏まえたサンプルプログラムを以下に記載する。class MyClass(): def __init__(self, msg = None): self.msg = msg def myPrint(self): print(self.msg) ##### instance1 = MyClass("Hello, world!") instance1.myPrint() instance2 = MyClass() instance2.myPrint()
これの実行結果は以下の通り。
Hello, world!
None
終わりに
本投稿では、Pythonでオブジェクトを生成する際のコンストラクタについて、サンプルプログラムを交えて、言語仕様とともに述べた。メソッド(コンストラクタ含む)を定義するときはdefを使う。
コンストラクタは__init__ という特殊関数を用いる。
メソッド(コンストラクタ含む)では、自分自身を意味するselfを記述する必要がある。
Pythonではメソッドのオーバーロードができない。これはつまり、コンストラクタも1つしか定義できないことを意味する。
デフォルト値を用意することで、オーバーロードのような挙動をするメソッド(コンストラクタ含む)を定義できる。それについては、上記サンプルプログラムに記載した。
参考文献
・【Python入門】クラスの使い方やオブジェクト指向の概念を理解しよう | 侍エンジニア塾ブログ | プログラミング入門者向け学習情報サイト・Python クラスについて - Qiita
・オダろぐ : Python>Pythonはメソッドのオーバーロードが使えないので?
・pythonで複数のコンストラクタを定義したい - Qiita
・Pythonを書き始める前に見るべきTips - Qiita
・Python 3.4.0 の新機能 (3) - Single-dispatch generic functions - Qiita