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