Pythonをはじめてみる(9)

継承

固有値問題を解くために行列を定義したいが、その前にベクトルを定義したい。
ベクトルを表現するのにリストを使うと簡単だが、そうすると加算・乗算が、


a = [1, 2]
print a + a # [1, 2, 1, 2]
print a * 3 # [1, 2, 1, 2, 1, 2]

となってしまう。これらの演算子をオーバーライドしたい。


リストを継承して、オーバーライドすればよい(たぶん)。
リストは、


a = [1, 2]
print type(a) #

listという名前の組み込み型だから、


class Vec(list):
...

とすれば、リストを継承できるらしい。


class Vec(list):
def __add__(self, a):
return Vec( map(lambda x, y: x + y, self, a) )

def __sub__(self, a):
return Vec( map(lambda x, y: x - y, self, a) )

def __mul__(self, a):
if isinstance(a, Vec):
return sum( map(lambda x, y: x * y, self, a) )
else:
return Vec( map(lambda x: x * 3, self) )

def __rmul__(self, a):
return self * a

def __div__(self, a):
return Vec( map(lambda x: x / a, self) )

このようにVecクラスを定義すると、


a = Vec([1, 2])
print a + a # [2, 4]
print a * 3 # [3, 6]

mapとかsumとかlambdaは、そのうち機会があれば。