継承
固有値問題を解くために行列を定義したいが、その前にベクトルを定義したい。
ベクトルを表現するのにリストを使うと簡単だが、そうすると加算・乗算が、
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は、そのうち機会があれば。