はじめに
Pythonを使っているとたまにダック タイピングという言葉を聞きますが、イマイチ理解できていなかったので少し調べてみました。
グーグル先生に聞いてみますと、
“If it walks like a duck and quacks like a duck, it must be a duck”
(もしもそれがアヒルのように歩き、アヒルのように鳴くのなら、それはアヒルに違いない) 出典: フリー百科事典『ウィキペディア(Wikipedia)』
ふむふむ。
アヒルのように歩いてアヒルのように鳴くのであれば・・・アヒルですね(笑)。
イメージ的にはプログラムの挙動を見たときに同じ振る舞いをするのであれば、それはダック タイピングだと考えて良さそうです。
どちらかと言うと、ポリモーフィズムの方がしっくりくるかと思います。
ポリモーフィズムは日本語でいう多様性、多態性と呼ばれるものですね。
他のプログラム言語でもちょくちょく登場しますが、簡単なものですが実際に実装しているコードを、見ていきたいと思います。
とりあえず、コードを書いてみる
試しに以下のようなコードを書いてみます。
class Softbank(object):
def to_call(self):
print('Softbankから電話を掛けます。')
def send_line(self):
print('SoftbankからLINEを送ります。')
softbank = Softbank()
softbank.to_call()
softbank.send_line()
# 実行結果は以下になります。
Softbankから電話を掛けます。
SoftbankからLINEを送ります。
まずはクラスを一つ作りインスタンス化後、各メソッドを実行したものです。
これは単純な処理なので難しくないですね。
もう一つ同じようなクラスを作ってみます。
class Docomo(object):
def to_call(self):
print('docomoから電話を掛けます。')
def send_line(self):
print('docomoからLINEを送ります。')
docomo = Docomo()
docomo.to_call()
docomo.send_line()
# 実行結果が以下になります。
docomoから電話を掛けます。
docomoからLINEを送ります。
これも同じような処理なので、特に難しくないですね。
オブジェクトを使うためのメソッドを用意
上記で作成したオブジェクトを使うためのメソッドを一つ用意します。
def smartphone(carrier):
carrier.to_call()
carrier.send_line()
# create an instance
softbank = Softbank()
docomo = Docomo()
smartphone(softbank)
smartphone(docomo)
このsmartphoneメソッドの引数にオブジェクトを渡してあげて、実行する流れです。
上記に記載したコードはパーツパーツでしたので、全体のサンプルコードを載せます。
class Softbank(object):
def to_call(self):
print('Softbankから電話を掛けます。')
def send_line(self):
print('SoftbankからLINEを送ります。')
class Docomo(object):
def to_call(self):
print('docomoから電話を掛けます。')
def send_line(self):
print('docomoからLINEを送ります。')
def smartphone(carrier):
carrier.to_call()
carrier.send_line()
# create an instance
softbank = Softbank()
docomo = Docomo()
smartphone(softbank)
smartphone(docomo)
# 実行結果は以下になります。
Softbankから電話を掛けます。
SoftbankからLINEを送ります。
docomoから電話を掛けます。
docomoからLINEを送ります。
ふむふむ。ちゃんと動作しますね。
クラスの型が異なっていても同じメソッド名があればそれらを使用することができ、オブジェクトを切り替えて使うことができる、という感じです。
すみません、なんかもっと良いサンプルが思いつきませんでした。。
まとめ
ダック タイピングは、PythonだけでなくRubyやPerl等の動的型付けオブジェクト指向型プログラミング言語でも使われているようです。
プログラミングのひとつの「お作法」ということですね。
ポリモーフィズムとほぼ一緒だと思いますし、共通メソッドがあればオブジェクトを切り替えて使用できるので、上手く使っていきたいと思います。
ご参考になれば幸いです。
コメント