あなたがC#/ Javaのようなインターフェイスについて厳密に話しているのなら、その答えは簡単です。静的型付き言語に属し、Pythonなどの動的言語には実際には適用されない概念です。
普段のpythonicアプローチは、あなたが得るオブジェクトを信頼し、必要な特性を持っていると仮定します。そうしないと、呼び出し元のために処理または実行できるランタイムエラーが発生することがあります。これは、言語の一般的な動的性質に一致します。何か問題が生じた場合は、実行時に浮上することが期待できます。
JavaまたはC#のインタフェースは、コンパイルの間に必要な前提条件(つまり特定のメソッドを持つオブジェクト)をチェックする手段です。これは(おそらく)コンパイル時のチェックの安全性を高めるためにランタイムの柔軟性の一部を取り除いています。それはインターフェースのどの概念は動的型付け言語で場所がないことを意味するわけではないことを
注意。実際には、Pythonは「メタタイプ」(イタレーション可能なものなど)というややぼやけた概念を持っています。特定の方法(単数または複数)の存在を確認することにより:
def process_sequence(seq):
if not hasattr(seq, '__iter__'):
seq = [seq] # turn single element into iterable
for elem in seq:
process_element(elem)
これが行く言語から非マニフェストインターフェースと概念的に類似しています。独自のiterableを使用する場合は、クラスを継承するJavaの場合と同様に、を実装することを明示せずに、__iter__
メソッドを実装するだけです。誰かがあなたのオブジェクトが実際に繰り返し可能かどうかをチェックしたい場合は、 "契約"、つまり__iter__
メソッドを持っているかどうかを確かめることができます。これはandronikusが答えたところで説明したものです。
恥知らずのプラグとして、私が実装しているpyduckライブラリに指摘できます。それは、そのような「契約」の検証を(反映を介して)簡素化(そして恐らくは標準化)し、それを少し信頼性を高めることを目指しています。
私はあなたが探しているものが正確ではないと思います。テンプレートとジェネリックスはまったく違うものです(T4テンプレートのような意味ですか?)Pythonで何をしたいのですか? – Davy8
OPとは、Java/C#ジェネリックのオリジナルのインスピレーションであるC++テンプレートを意味します。 –
C++テンプレートは、ジェネリックよりもはるかに多く、これはOPのC++テンプレートについての解答を無効にします。しかし、C#だけが言及されており、 "テンプレート/ジェネリックス"という言葉はOPが本当にその違いを認識していないことを示唆しているので、私はそうは思わない。 – delnan