Pythonのダックタイピングを試してみる|ダックタイピング

python_ducktyping_pcPython
python_ducktyping_pc

はじめに

Pythonを使っているとたまにダックタイピングという言葉を聞きますが、なんかイマイチ理解できていなかったので少し調べてみました。

ダックタイピング(duck typing)についてグーグル先生に聞いてみますと、

“If it walks like a duck and quacks like a duck, it must be a duck”

(もしもそれがアヒルのように歩き、アヒルのように鳴くのなら、それはアヒルに違いない) 出典: フリー百科事典『ウィキペディア(Wikipedia)』

ふむふむ。

アヒルのように歩いてアヒルのように鳴くのであれば・・・アヒルですね(笑)。

Pythonのダックタイピングは、イメージ的にはプログラムの挙動を見たときに同じ振る舞いをするのであれば、それはダックタイピングだと考えて良さそうです。

ダックタイピングという言葉より、ポリモーフィズムの方がしっくりくるかと思います。

ポリモーフィズムは日本語でいう多様性、多態性と呼ばれるものですね。

他のプログラム言語でもちょくちょく登場します。

とりあえず、コードを書いてみる

試しに以下のようなコードを書いてみます。

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等の動的型付けオブジェクト指向プログラミング言語でも使われているようなので、プログラミングのひとつの「お作法」ということですね。

ポリモーフィズムとほぼ一緒だと思いますし、共通メソッドがあればオブジェクトを切り替えて使用できるので上手く使っていきたいと思います。

ご参考になれば幸いです。

コメント

タイトルとURLをコピーしました