前回、オブジェクトとクラスの関係について説明しました。このページではPythonのクラスの定義方法について説明します。
Contents
クラス定義とインスタンス化
クラス定義
まずはクラス定義の書き方から説明しましょう。class文を使用します。後ほど具体的な説明をしますので、まずはクラスとはこういうものなのだと思ってください。
""" クラスのドキュメンテーション """
def メソッド1(self, ...):
処理
:
def メソッド2(self, ...):
処理
:
class文の後にクラス名と継承元クラス名を記述し、:(コロン)の後に一段落インデントしてクラス定義を記述します。なお、継承元クラス名は省略可能です。空のクラスを作りたい場合は関数と同様に以下のようにpassを記述します。
class Sample: pass
クラスのインスタンス化
次に、クラスをインスタンス化する方法について見てみましょう。以下の文となります。
クラスの構成要素
クラス定義とインスタンス化について説明しました。ここから具体例を交えてクラスの構成要素について説明します。
まずは、クラス定義とインスタンス化のサンプルです。
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行目)
デストラクタ
__del__という名前のメソッドを定義すると、オブジェクトが削除される際にそのメソッドが自動で実行されます。
ただし、以下の理由よりこのサイトでは使用を推奨しません。
- いつデストラクタが呼び出されるかわからない
- デストラクタが呼び出される保証がない
- 上記理由より予想しない動作をすることがあり、設計が難しい