プログラミングにおいて、ダックタイピングは動的タイピングのスタイルです。このスタイルでは、オブジェクトの有効なセマンティクスは、特定のクラスからの継承や特定のインターフェイスの実装によってではなく、現在のメソッドとプロパティのセットによって決まります。
この概念の名前は、ジェームズ・ウィットコム・ライリーによって提案されたアヒル・テストに由来しています。「アヒル・テスト」は次のように表現できます:
「鳥がアヒルのように歩き、アヒルのように泳ぎ、そして鳴いているのを見たとき。」アヒル、その場合、その鳥はアヒルと呼ばれます。」
アヒルタイピングでは、オブジェクト自体の種類ではなく、それがどのように使用されるかに焦点が当てられます。たとえば、アヒル タイピングを使用しない言語では、アヒル型のオブジェクトを受け取り、その walk メソッドと bark メソッドを呼び出す関数を作成できます。ダック タイピングを使用する言語では、このような関数は任意の型のオブジェクトを受け入れ、その walk メソッドと call メソッドを呼び出すことができます。呼び出す必要があるメソッドが存在しない場合は、実行時エラーが発生します。正しい walk メソッドと call メソッドを持つオブジェクトはすべて関数で受け入れられるという事実が上記のステートメントにつながり、型を決定するこの方法の名前が付けられました。
ダックタイピングは、多くの場合、メソッドや関数のパラメータの型をテストするのではなく、ドキュメント、明確なコード、および正しい使用法を保証するためのテストに依存することで恩恵を受けます。静的型付け言語から動的型付け言語に移行するユーザーは、多くの場合、静的 (実行時前) 型チェックを追加しようとします。これにより、ダック タイピングの利点とスケーラビリティが損なわれ、言語の動的な性質が制約されます。
Python コード例
上記は空すぎる可能性があります。例えばPythonではStringIO、GzipFile、socketなどファイル的なものがたくさんあります。これらには同じメソッドが多数あり、それらをファイルとして使用します。
別の例として、list.extend() メソッドでは、反復可能であればパラメーターがリストであるかどうかは気にしないため、パラメーターは list/tuple/dict/string/generator などにすることができます。
ダックタイプは動的言語でよく使用され、非常に柔軟であるため、Python は Java とは異なり、多くのデザインパターンを持ちます。
次の例では、ダックタイピングを使用してポリモーフィズムを実現しています。
#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)
別の例として、
出力ストリームをハックしてみましょう。
import sys sys.stdout = open('stdout.log', 'a') #只要是file-like,不管是什么类型 print 'foo' sys.stdout = sys.__stdout__ #恢复 print 'bar'
このようにして、出力ストリームがファイルに書き込まれます。
ダックタイピングダックタイピングプログラミングの詳細な説明とPython実装関連記事については、PHP中国語Webサイトに注目してください。