クラスの基本

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

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

クラス定義

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

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

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

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

class Sample:
    pass

クラスのインスタンス化

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

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

クラスの構成要素

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

まずは、クラス定義とインスタンス化のサンプルを見てみましょう。平面座標を表すには2つの数値(x, y)を扱う必要があります。また、平行移動などもできると便利そうですね。そういった変数や機能をクラスにひとまとまりにしてみます。なお、このオブジェクトがもつデータを属性と呼ぶ場合があります。例えば、オブジェクトOは属性として変数x, yを持つ、といった使い方をします。

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 # yに代入
cood.show_coordinate() # メソッドを利用する

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

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

インスタンス変数

オブジェクト内部で保持する変数をインスタンス変数と呼びます。(サンプルコードの6,7行目) インスタンス変数はメンバ変数と呼ばれることもあります。

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

内部からアクセスする場合は、self.変数名でアクセスします。(サンプルコードの16行目)

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

メソッド

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

コンストラクタ

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

__str__

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

補足 デストラクタ

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

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