PythonにおけるOOPのやり方

初めてのPython 第2版

現在第6部「クラスとオブジェクト指向プログラミング」を読んでます。OOPの基本的なことは知っているので、Pythonではどうやるのかという部分を学ぶ。とはいえ演算子のオーバーロード、多重継承など、大事そうだが知らない言葉が色々と出てきている。

例によって、色々試すために簡単な例を書いてみた。

myfirstclass.py

class MyFirstClass:
def __init__(self,title='default'):
self.title = title
def showtitle(self):
print self.title
class MySecondClass:
def showminchar(self):
print min(self.title)
class MyFirstSubClass(MyFirstClass, MySecondClass):
def __add__(self,other):
return MyFirstSubClass(self.title + other)
def __mul__(self,other):
return MyFirstSubClass(self.title * other)
def showtitle(self):
print 'The title is %s' % (self.title)
def getlength(self):
return len(self.title)

__init__というのがいわゆるコンストラクタ。Pythonでは「演算子のオーバーロード」の一種とされているようなので、コンストラクタが実行される際の演算に使われるもの、というのが正しいのかも。__add__というのは+演算子をオーバーロードしている部分で、これによりMyFirstSubClassのインスタンスに+演算を行うことが可能になる。__mul__は*演算子に対応しているもの。

MyFisrtSubClassは、MyFirstClassとMySecondeClassの両方から継承しているサブクラスである。このように多重継承すると、メソッド等は左側から順に採用されるらしい。

実行結果。

>>> Instance1 = MyFirstSubClass('Python')
>>> Instance1.showtitle()
The title is Python
>>> Instance1.getlength()
6
>>> Instance2 = Instance1 + 'GoGo!'
>>> Instance2.showtitle()
The title is PythonGoGo!
>>> Instance3 = Instance2 * 3
>>> Instance3.showtitle()
The title is PythonGoGo!PythonGoGo!PythonGoGo!

多重継承や演算子のオーバーロードがどのように役に立っていくのかはまだ想像できていないのだが(__init__は別として)、クラスのインスタンスをビルトインオブジェクトと同じ形式で演算出来るということは、コードの可読性を高めることには繋がるのかもしれない。

なんにせよ、与えられた道具は上手く使って素晴らしいコードを書きたいものである。