ポリモーフィズム

ポリモーフィズムって何なのかってことをつかむために「じゅんいち☆かとうの技術日誌」さんhttp://d.hatena.ne.jp/j5ik2o/20080508/1210246936
に書かれていたサンプルをpythonで書いてみた。
Javaのサンプルコードをそのままpythonに適用しただけなので、基本的に冗長になってます。
まずはAnimal class
pythonにはインターフェイスが無いのでここは実質意味は無いけど練習なのでとりあえず書くと、

>>> class Animal:
   ...:     def cry(self):
   ...:         pass
   ...:     def run(self):
   ...:         pass
   ...:     def sit(self):
   ...:         pass
   ...:     def sanpo(self):
   ...:         pass
   ...:
   ...:

ここではメソッドを宣言してるだけ。
次はAbstractAnimal class

>>> class AbstractAnimal(Animal):
   ...:     def sanpo(self):
   ...:         self.run()
   ...:         self.cry()
   ...:         self.sit()
   ...:
   ...:

sanpo()メソッドを実装。
つづいてCat class

>>> class Cat(AbstractAnimal):
   ...:     def cry(self):
   ...:         print "nyannyan"
   ...:     def run(self):
   ...:         print "nyannyan run"
   ...:     def sit(self):
   ...:         print "nyanyan sit"
   ...:
   ...:

ここでは猫を実装。
ここでちょっと試してみる。
Cat classのインスタンスオブジェクトを呼び出して、sanpo()メソッドを使うと、

>>> cat = Cat()

>>> cat.sanpo()
nyannyan run
nyannyan
nyanyan sit

大丈夫みたいなので、犬を実装してやっぱり試してみると、

>>> class Dog(AbstractAnimal):
   ...:     def cry(self):
   ...:         print "wanwan"
   ...:     def run(self):
   ...:         print "wanwan run"
   ...:     def sit(self):
   ...:         print "wanwan sit"
   ...:
   ...:

>>> dog = Dog()

>>> dog.sanpo()
wanwan run
wanwan
wanwan sit

次はAnimalFactory class
ここもインターフェイスだからあまり意味なし。

>>> class AnimalFactory(object):
   ....:     def create(self, animalword):
   ....:         pass
   ....:
   ....:

ここではcreateメソッドを宣言。
最後にAnimalFactoryImpl class

>>> class AnimalFactoryImpl(AnimalFactory):
   ....:     def create(self, animalword):
   ....:         if animalword.lower() == "dog":
   ....:             return Dog()
   ....:         elif animalword.lower() == "cat":
   ....:             return Cat()
   ....:         return None
   ....:
   ....:

ここではcreateメソッドを実装。
それではAnimalFactoryImpl classのインスタンスオブジェクトを呼び出して
createメソッドで"dog"を指定してやると、

>>> af = AnimalFactoryImpl()

>>> animal = af.create("dog")

>>> animal.sanpo()
wanwan run
wanwan
wanwan sit
変数animalにDog classのインスタンスを代入できて、sanpoメソッドを使うと。

"cat"を指定すれば、Cat classのインスタンスができる。

>>> animal2 = af.create("cat")

>>> animal2.sanpo()
nyannyan run
nyannyan
nyanyan sit

Dog classもCat classもsanpoメソッドを実装しているから共通のメソッドが使える。
つまり、メソッドを呼び出す側を共通化できることがポリモーフィズムなわけだ。