クラスの基本

前回、オブジェクトとクラスの関係について説明しました。このページではPythonのクラスの定義方法について説明します。

クラス定義とインスタンス化

クラス定義

まずはクラス定義の書き方から説明しましょう。class文を使用します。後ほど具体的な説明をしますので、まずはクラスとはこういうものなのだと思ってください。

クラスの定義
class クラス名(継承元クラス名):
    """ クラスのドキュメンテーション """
    def メソッド1(self, ...):
        処理
        :

    def メソッド2(self, ...):
        処理
        :

class文の後にクラス名と継承元クラス名を記述し、:(コロン)の後に一段落インデントしてクラス定義を記述します。なお、継承元クラス名は省略可能です。空のクラスを作りたい場合は関数と同様に以下のようにpassを記述します。

class Sample:
    pass

クラスのインスタンス化

次に、クラスからオブジェクトを生成する方法について説明します。前のページでも解説したとおり、オブジェクトを生成することをインスタンス化とも呼びます。以下の文となります。

オブジェクトの生成
変数 = クラス名()

クラスの構成要素

クラス定義とインスタンス化について説明しました。ここから具体例を交えてクラスの構成要素について説明します。

まずは、クラス定義とインスタンス化のサンプルです。以下のサンプルでは、平面座標を表すクラスをインスタンス化し、座標設定と座標表示を行います。
平面座標を表すには2つの数値を扱う必要があります。また、平行移動などもできると便利そうですね。そういった数値や機能をクラスにひとまとまりにしてみます。

class Coordinate:
    """ 座標クラス """

    def __init__(self):
        """ 初期化 """
        self.x = 0
        self.y = 0

    def move(self, x, y):
        """ 平行移動 """
        self.x += x
        self.y += y

    def show_coordinate(self):
        """ 座標を表示する """
        print(self.x, self.y)

    def __str__(self):
        """ 文字列表現を返す """
        return "({0},{1})".format(self.x, self.y)


# クラスの利用サンプル
cood = Coordinate() # インスタンスを生成する
cood.x = 100 # メンバxに代入
cood.y = 200 # メンバxに代入
cood.show_coordinate() # メソッドを利用する

print(cood) # 文字列表現を取得する

構成要素を確認してみましょう。

メソッド

既に用語としての定義はしましたが、クラスのメンバとして定義されている関数のことをメソッドと呼びます。(サンプルコードの14行目)メソッドは必ずselfという引数を持ち、メンバ変数を参照する際はself.メンバ変数名の書式でアクセスします。

コンストラクタ

インスタンス生成時にクラスに__init__という名前のメソッドが定義されていると、これが自動的に呼びだされます。(サンプルコードの4行目)通常、インスタンス初期化処理(メンバ変数の初期化など)を記述します。

メンバ変数

クラス内部で保持する変数です。(サンプルコードの6,7行目)

pythonには変数のアクセス修飾子はありません。基本的にはすべてpubulicであるため、Javaのようにメンバ毎のgetter、setterの実装はあまり見かけられません。

内部からアクセスする場合は、メソッドの項で書いたとおり、self.メンバ変数名でアクセスします。(サンプルコードの16行目)

外部からアクセスする場合は、オブジェクト変数名.メンバ変数名でアクセスします。(サンプルコードの25, 26行目)

__str__

JavaのtoStringメソッドに該当します。オブジェクトの文字列表現を返します。(サンプルコードの18行目)
必ずしも実装する必要はないのですが、print出力する際に適切な文字列表現があったほうが開発がスムーズに進むかと思います。

デストラクタ

__del__という名前のメソッドを定義すると、オブジェクトが削除される際にそのメソッドが自動で実行されます。
ただし、以下の理由よりこのサイトでは使用を推奨しません。

  • いつデストラクタが呼び出されるかわからない
  • デストラクタが呼び出される保証がない
  • 上記理由より予想しない動作をすることがあり、設計が難しい