07/02/18 14:06:03
>>35
そのプログラムは単にオブジェクト指向のポリモーフィズム(多様性)を利用しているだけなので
__getattribute__ は必要ありません。そのプログラムを Python で書くなら、こんな感じになります。
class Shain:
def getKyuyo(self): return 0
class Bucho(Shain):
def getKyuyo(self): return 700000
class Kacho(Shain):
def getKyuyo(self): return 500000
class Tanto(Shain):
def getKyuyo(self): return 300000
s = [ Bucho(), Kacho(), Kacho(), Tanto(), Tanto(), Tanto() ]
goukei = 0
for p in s: goukei += p.getKyuyo()
print goukei
ちなみに、Python では Bucho Kacho Tanto を Shain のサブクラスにしなくても動きます。
これは Java の「変数の型」という概念が Python にはないからです。
Python ではオブジェクトに対してメソッドを呼び出した場合、その名前を持つメソッドが
動的に(実行時に)決定されるので、スーパークラスで抽象化する必要はありません。(ダックタイピング)
(ただし、スーパークラスの振る舞いを引き継ぐ為の継承は有効な手段です)
呼び出されるメソッドが静的に(コンパイル時に)決定される Java や C++ などとの大きな違いですね。