はじめに
オブジェクト指向の考え方がおおまかにでもつかめましたか?
オブジェクト指向の考え方はどの言語でもほぼ共通なので、他の言語を学んだことがある方はそれほど苦労せずに理解できるでしょう。
Pythonが初めての言語という方は、とにかくコードを書いて、オブジェクト指向に触れてみることが重要です。
実践を通してオブジェクト指向を学んでいきましょう。
この記事では、Python初心者の方向けに、Pythonでのオブジェクト指向プログラミングについて説明していきます。ぜひ自分で指を動かしてプログラミングしましょう。
オブジェクト指向のおさらい
オブジェクト指向は、オブジェクト(もの、物体)を中心としてプログラミングを進めていくパラダイム(考え方、見方)のことです。
たとえば、数値や日付、ファイルなどがオブジェクトとして捉えることができます。
Pythonでは、オブジェクトを表現するために「クラス」と「インスタンス」を使います。
まずは、クラスの基本的な定義方法からみていきましょう。
基本的なクラスの定義方法とインスタンス化
クラスには、メンバ変数とメソッド(関数)を持たせることができます。
たとえば、次のような例をみてみましょう。
例:
class Hello: name = "Anonymous" def setname(self, value): self.name = value def say(self): print("Hello, {0}".format(self.name))
この例では、Helloクラスを定義して、メンバ変数nameとメソッドsetnameおよびsayを持たせてあります。
メンバ変数については通常の変数定義と変わりありませんね。
一方、メソッドについては少し違いあります。メソッドは第一引数に自分自身のインスタンス(self)を受け取ります。これがどのように動作するかは、次の例で確認してみましょう。
例:
hello = Hello() hello.say()
この例では、先程作ったHelloクラスをインスタンス化しています。
クラスはインスタンス化しないと使うことができませんので、クラス名でコンストラクタ(関数)を呼び出してインスタンスを変数(hello)に割り当てています。
注目してほしいのは、次のsayメソッドです。先程、sayメソッドの引数にselfを定義しました。
しかし、メソッドを呼び出すときには、第一引数は必要ありません。自動的に自分自身のインスタンス(この例ではhello変数に代入されているオブジェクト)が渡されます。
そのため、sayメソッド側では、自分自身のインスタンスに存在するname変数にアクセスできるというわけです。
さらに重要なことは、インスタンスは複数作成でき、互いに独立しているということです。たとえば、次のように同じクラスから2個目のインスタンスを作成しても互いのメンバ変数は影響を受けません。
例:
hello2 = Hello() hello2.setname("Taro") hello.say() hello2.say()
この例では、setnameメソッドを使って、name変数を書き換えています。setnameメソッドを呼び出すときの引数が一つだけであることに注意して下さい。
実行すると、helloインスタンスとhello2インスタンスではsayメソッドの結果が異なることが確認できるでしょう。
このように、インスタンスはクラスのコピーのように振る舞います。
オブジェクト指向の真髄は継承にあり
クラスに関連する話題として、継承(サブクラス)があります。
これは、クラスに親子関係を持たせるものです。
次の例をみて下さい。
例:
class Animal: name = "noname" def setname(self, value): self.name = value def call(self): print("my name is {0}".format(self.name)) class Dog(Animal): def call(self): print("my name is {0} bow wow!".format(self.name)) class Cat(Animal): def call(self): print("my name is {0} mew mew!".format(self.name)) dog = Dog() dog.setname("poti") dog.call() cat = Cat() cat.setname("tama") cat.call()
この例では、3つのクラス(Animal、Dog、Cat)を定義しています。
DogクラスとCatクラスの定義をよく見て下さい。
この2つのクラスは、Animalクラスを継承しているサブクラスなのです。
サブクラスは、親になっているクラスの定義をそのまま引き継ぎます。もちろん、そのままでは意味がないので、ここではcallメソッドを上書きして再定義しています。
実行すると、親のメンバ変数やメソッドを引き継ぎつつ、上書きしたメソッドがしっかり呼び出されていることが確認できるでしょう。
このように、継承をうまく使えばコードの重複を防ぐことができます。
まとめ
実際にコードを書いてみて、オブジェクト指向への理解が深まりましたか?
クラスやインスタンス、継承(サブクラス)などの基本的な概念を忘れないようにしましょう。
プログラミング初心者の方は、今すぐに理解できなくてもかまいません。
オブジェクト指向を意識しつつ、学習を進めていけば、いずれ自然と理解できるようになるでしょう。