MixinによるDuck Typing

リンク先の話題とは何も関係ないが、PythonでMixinを使用してDuck Typingを書いてみた。speakメソッド以外に共通のメソッドが増えれば、DRY原則から通常は継承することになるが、別に継承しなくても同じことがMixinで実現可能。

In [1]: s='''
   ...: def speak(self):
   ...:     print self.word
   ...: '''

In [2]: class Dog:
   ...:     exec(s)
   ...:     word = 'woof!'
   ...:

In [3]: class Cat:
   ...:     exec(s)
   ...:     word = 'meow!'
   ...:

In [4]: [p.speak() for p in [Dog(), Cat()]]
woof!
meow!
Out[4]: [None, None]

static/dynamic duck typingの違いが良く分からなかったが、機能的な違いを言っているのではなく、実装する際に使うテクニックということだろうか?Duck Typingなので型安全になるということでもなさそうだし。


しかし、JavaでDuck Typingするには、Genericsで無理なので諦めていたが、Reflectionを使用すれば可能だったのか。知らなかった。Javaでは、実践でReflection多用するとブログに書いている人もいたが、Reflectionは上記リンクの例を見る限り型安全ではなさそうで、それだったら動的型付けとかeval()と大差ないなあと思ってしまった。Javaは色々な機能をReflectionで逃げているような…。というか、初期の設計ミスによる苦肉の策?


以下はGenericsとReflectionを組み合わせた例だが、これは尋常じゃない。


まあ、Reflectionがなければ実現できないと思うけど。JavaのReflectionもきちんと勉強しないとなあ。基礎的な良い本ないかな。