duck typingアヒルのタイプのプログラム設計とPythonの実現例を詳しく説明します。


プログラム設計では、アヒルタイプ(英語:duck typing)はダイナミックタイプのスタイルです。このようなスタイルでは、1つのオブジェクトの有効な意味は、特定のクラスからの継承または特定のインターフェースの実装ではなく、現在の方法と属性のセットによって決定される。
この概念の名前はJames Whitcomb Rileyによって提案されたアヒルのテストに由来しています。「アヒルのテスト」はこのように表現できます。
「鳥を見て歩くとアヒルのようになり、泳いでいるとアヒルのようになり、鳴いてもアヒルのようになります。この鳥はアヒルと呼ばれています。」
アヒルのタイプでは、対象のタイプそのものではなく、どうやって使うかが注目されます。例えば、アヒルの種類を使わない言語では、アヒルの種類のオブジェクトを受け入れて、歩き方や呼び方を呼び出す関数を作成することができます。アヒルの種類の言語を使用する場合、このような関数は任意の種類のオブジェクトを受け入れ、その歩き方と呼び方を呼び出すことができます。これらの呼び出しが必要な方法が存在しない場合、運転中のエラーが発生します。このような正しい歩き方と呼び方を持つオブジェクトがいずれも関数によって受け入れられるという行為は、上記のような表現を引き出しています。
アヒルのタイプは、通常、テスト方法や関数のパラメータの種類ではなく、ドキュメント、明確なコード、およびテストに依存して正確な使用を確保します。静的なタイプの言語から動的なタイプの言語に移るユーザは、通常、いくつかの静的なタイプの検査を追加することを試み、アヒルのタイプの利点と伸縮性に影響を与え、言語の動的特性を制約する。
Pythonコードの例
上のように言ったら穴が空いているかもしれません。例えばPythonには、SteringIO、GzipFile、socketなど、file-likeのものがたくさんあります。それらは同じ方法がたくさんあります。私たちはそれらをファイルとして使います。
また、例えばlist.exted()方法では、そのパラメータがlistであるかどうかには関心がありません。反復可能である限り、そのパラメータはlist/tuple/dict/文字列/ジェネレータなどとすることができます。
アヒルのタイプは動態言語でよく使われています。pythonはjavaのように専門的にたくさんのデザインパターンを作りたくないです。
次の例はduck typingで多状態を実現します。

#coding=utf-8 
class Duck: 
  def quack(self): 
    print "Quaaaaaack!" 
 
class Bird: 
  def quack(self): 
    print "bird imitate duck." 
 
class Doge: 
  def quack(self): 
    print "doge imitate duck." 
 
def in_the_forest(duck): 
  duck.quack() 
 
duck = Duck() 
bird = Bird() 
doge = Doge() 
for x in [duck, bird, doge]: 
  in_the_forest(x) 

栗をもう一つ挙げます
私たちはhack出力ストリームに来ました。

import sys 
 
sys.stdout = open('stdout.log', 'a') #   file-like,        
print 'foo' 
 
sys.stdout = sys.__stdout__ #   
print 'bar' 
これで出力をファイルに書き込みます。