2011-09-27 9 views
6

私は数ヶ月間C#プログラマーとして働き、 generics/templates というインターフェースに慣れました。これはオブジェクトの作成方法を気にせずにライブラリに渡すことができます。PythonにはC#/ Javaスタイルのインターフェイスがありますか?

私は比較的大規模なプロジェクト、おそらくはPythonで始めるつもりです(前にPythonをたくさん書いていましたが、データ解析などのコードは主に自分のコードです)、同様の概念が存在するのだろうかと疑問に思っていましたこの言語で?私はそれのためにグーグルを試して、多くを思い付くことはありません。

答えが「いいえ」の場合は問題ありませんが、その場合は一般的に人々は何をしますか?

+0

私はあなたが探しているものが正確ではないと思います。テンプレートとジェネリックスはまったく違うものです(T4テンプレートのような意味ですか?)Pythonで何をしたいのですか? – Davy8

+0

OPとは、Java/C#ジェネリックのオリジナルのインスピレーションであるC++テンプレートを意味します。 –

+0

C++テンプレートは、ジェネリックよりもはるかに多く、これはOPのC++テンプレートについての解答を無効にします。しかし、C#だけが言及されており、 "テンプレート/ジェネリックス"という言葉はOPが本当にその違いを認識していないことを示唆しているので、私はそうは思わない。 – delnan

答えて

5

インタフェースの私の理解では、Javaからなので、うまくいけば、それはあなたが何を意味するかに十分に近いです...

Pythonはdynamic typingを使用しているため、特定のオブジェクトは、メソッドやフィールドのセットを持っていると主張するいかなる文法的な方法はありません/ duck typing。あなたは、オブジェクトが特定のメソッドやフィールドを持っているかどうかを確認したい場合は、次のことができます。

  • Dig into it with reflection(これはほとんどの作品である)あなたがすべてのその__dict__(辞書に欲しいもののために
  • チェック オブジェクトのメンバー)。 MyObj.__dict__.hasKey(o)はあなたが望むものだと思います。
  • あなた、あなたの仲間の開発者、またはあなたのユーザーがあなたに適切なオブジェクトを与えてくれただけのオブジェクトと信頼を使用してください。 (最大の簡単ですが危険です)
  • または、上記を行い、try/exceptブロックで囲みます。

Pythonで複雑なクラスのセットを設計することは、C言語のようなものとは非常に異なる経験であるため、あなたに不快感を与えるようなことを準備してください(上記のオプション3のように)。がんばろう!

+0

ありがとうございます - 私はオプション3が利用可能であることを知っていましたが、他のチームメンバーにそれを使用しないように納得させることができたら、私は試してみます:) 残りは便利です。ありがとう! – samb8s

+0

おそらく良いアイデア、ええ。私は私の個人的なものでそれを多くしますが、私が間違っていると誰も死ぬことも、お金を失うこともありません。 – andronikus

5

pythonは動的に型付けされているので(ほとんどの場合)ジェネリック/テンプレートは必要ありません。

15

答えが「いいえ」なら、それは問題ありませんが、その場合は一般的に人々は何を代わりに行いますか?

Duck Typing

C#の技術的な手荷物を削除してPythonにアプローチすることが重要です。

という新しい言語としてPythonを学んでください。 PythonとC#の間に概念をマップしないでください。そういうわけで、狂気がある。


"インターフェイスではなく、ジェネリック、またはテンプレート"

は問題ではありません。すべての静的型宣言技術は必要ありません。そのためには、規則を破るために型キャスティングも必要ありません。

3

zope.interface

しかし、ほとんどの人はそれを使用しないでください。

4

あなたが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ライブラリに指摘できます。それは、そのような「契約」の検証を(反映を介して)簡素化(そして恐らくは標準化)し、それを少し信頼性を高めることを目指しています。

関連する問題