このサイトについて

みんなのPython Webアプリ編 - Pythonのオブジェクト指向機能

みんなのPython Webアプリ編 - Pythonのオブジェクト指向機能

Pythonのオブジェクト指向機能

Pythonはオブジェクト指向のスクリプト言語です。新しくクラスを定義したり、既存のクラスを継承する、といったオブジェクト指向言語としての機能を一通り備えています。

Pythonのオブジェクト指向機能はとてもシンプルです。そのようなこともあり、C++やJavaのような他のオブジェクト指向言語を使った経験のある人から見ると、Pythonのオブジェクト指向機能は物足りなく映るかもしれません。しかし、言語全体としての実装はとても見通しが良く作られていますし、必要な機能は備えています。開発を進めるに当たって困ることはほとんどありません。

そもそも、Pythonはオブジェクト指向機能の利用を強制しないような作りになっています。無理にオブジェクト指向機能を使おうとせず、必要に応じて利用するのがPythonの流儀です。

すべてがオブジェクト

純粋オブジェクト指向言語としてPythonを見た場合、その特徴を一言で表すとするなら「すべてがオブジェクト」ということになるでしょう。文字列やリストなどの組み込み型だけでなく、モジュールやクラス、関数やメソッドまでもがオブジェクトとして扱えます。

ありとあらゆるものがオブジェクトなので、関数やクラスを変数に代入したり、挙動を動的に書き換えることができます。この性質をうまく利用すると、複雑なプログラムを驚くほど簡潔に書くことができます。ここでは、一般的によく利用されるPythonのオブジェクト指向機能、クラスの定義と利用方法に限って解説します。

クラスを定義する

Pythonでクラスを定義するにはclass文を利用します。class文の後にクラス名を添えて、クラスを定義します。既存のクラスを継承するには、クラス名の後に括弧を添えて継承したいクラスを記述します。多重継承をする場合には、複数のクラスをカンマ(,)で区切って並べます。Pythonでは、組み込み型を含むすべての型やクラスを継承できます。

クラス定義の例:

:::python
class SomeClass:
    def __init__(self, num):
        """初期化メソッド"""
        self.num = num

    def some_method(self, param):
        """メンバ変数と引数をかけ算して返す"""
        return self.num * param

クラスのコードはインデントして記述します。クラスには、メソッドやアトリビュート(メンバ変数)を定義できます。

Pythonのオブジェクト指向機能はとてもシンプルに作られています。クラス自体と、クラスから生成するインスタンスオブジェクトが独自の名前空間のようなものを持っていて、メソッドやアトリビュートはその名前空間に付属する形で保存されています。

Pythonではプライベート・メソッドを定義することができません。クラスのメソッドはすべてバーチャルな公開メソッドとなります。クラスのメソッドなどを外部から隠蔽するには、クラス名の前にアンダースコア(_)を1つか、または2つ付けます。

クラスインスタンスの生成

クラスからオブジェクトを生成するには、次のようにクラス名自体を関数 のように呼び出します。

:::python
ins = SomeClass()

このようにすると、あらかじめ定義されたクラスからオブジェクトが作られます。クラスから作られるオブジェクトをクラスインスタンスと呼びます。__init__()というメソッドは初期化メソッドです。クラスのインスタンス生成時に呼ばれる、特殊な働きを持ったメソッドです。Pythonには、デフォルトとなるアトリビュートを定義する方法がありません。このため、たいていは初期化メソッド内でクラスのメンバ変数の初期値を定義します。

Pythonでは、オブジェクトの持ち物にアクセスするためにドット(.)を使います。生成したインスタンスオブジェクトを使ってメソッドを呼び出すには、次のようにします。

:::python
ins.some_method(10)

第1引数self

Pythonのメソッドには、第1引数としてselfを定義しておきます。この引数には、クラスのインスタンスオブジェクト自体が暗黙に渡されます。クラスインスタンス自体には、オブジェクトのアトリビュートやメソッドが持ち物として紐づけられています。メソッド内部では、第1引数selfを使ってクラスインスタンスの持っているアトリビュートにアクセスするわけです。

Pythonでは代入をすると変数が定義されるのと同じように、インスタンスオブジェクトのアトリビュートに代入をすると新しいアトリビュートが作られます。初期化メソッドであらかじめ定義しておきたいアトリビュートに代入を行い、アトリビュートの初期化を行えばよいわけです。

特殊メソッド

Pythonのクラスには、アンダースコア2つで始まるメソッドが何種類か利用できます。このようなメソッドは特殊メソッドと呼ばれています。先に解説した初期化メソッド__init__()も特殊メソッドの一種です。

特殊メソッドを使うと、演算子やシーケンスのインデックや辞書型のキーを使ったアクセス、アトリビュートへのアクセスといった言語の基本的な機能をオーバーライドできます。

2015-01-20 18:37