2012-04-15 33 views
2

私はプロジェクトのためにPythonを手に入れようとしています。私は、抽象クラスとクラスの使い方について少し混乱しています。 (私は非常に経験豊富なプログラマーではないので、この質問の基本レベルのために謝罪します。)私はJava/Ocamlのバックグラウンドから来ています。私がしようとしてきたことは次のとおりです。私は、グラフの実装を持つ Pythonの抽象化?

このような
class AbstractGraph: 
    def method1(self): 
     raise NotImplementedError 
    ... 

class AbstractAdvanced: 
    def method2(self): 
     raise NotImplementedError 
    ... 

何かを見て、(いくつかのより多くの空想の方法とグラフ)とgraphadvanced:

class Graph(AbstractGraph): 
    def method1(self): 
     * actual code * 

が今私の質問です:私は何かを行うことができますこのような?言い換えれば

class Advanced(AbstractAdvanced, AbstractGraph): 
    def method2(self): 
     *actual code, using the methods from AbstractGraph* 

、どのように私は抽象的AbstractGraphの方法の面で先進のメソッドを定義することができ、その後、何とかグラフの実装と拡張の定義を使用して高度のインスタンスを取得するには、コンストラクタにグラフを渡しますか?

Ocamlに関して、私はAbstractAdvancedとAbstractGraphをモジュール型として扱おうとしていますが、私はPythonで少し遊んできましたが、これをどのように動作させるのかは分かりません。

+1

は、書式設定を修正し、あなたがしているとき、あなたは 'code']タブをクリックし編集 – Shep

+2

Pythonでは、通常このようなものは必要ありません。実際のコードを書くだけです。 – georg

+0

私はそれを理解しているので、pythonは厳密なインターフェースとタイプチェックの概念を使用していません。 Java。ダックタイピングを通して、それは本当に意味をなさない。だからあなたはそれをやるだけです。 Couはisinstance()があなたのパラメータを要求することによってそれを強制することができますが、それは実際にあなたが使用していた静的型付けを実際には与えません。 Pythonは動的に型付けされた言語です。 – sleeplessnerd

答えて

1

抽象基本クラスを作成することができますが、それらは限定されたユーティリティです。具体的なクラスを使用してクラス階層を開始することは、より一般的です(オブジェクトや他のサードパーティクラスから継承した後)。

あなたは一緒に作品様々なクラス部分的にいくつかのプロトコルは、その後、ちょうどあなたの実装クラスを継承クラスを作成する場合:

#Always inherit from object, or some subtype thereof, unless you want your code to behave differently in python 2 and python 3 

class AbstractGraph(object): 
    def method1(self): 
     raise NotImplementedError 

class Graph(AbstractGraph): 
    def method1(self): 
     * actual code * 

class GraphToo(AbstractGraph): 
    def method1(self): 
     * actual code * 

class AbstractAdvanced(AbstractGraph): 
    def method2(self): 
     raise NotImplementedError 

class Advanced(Graph,AbstractAdvanced): 
    def method2(self): 
     *actual code, using the methods from Graph* 

# order of classes in the inheritance list matters - it will affect the method resolution order 
class AdvancedToo(GraphToo, Advanced): pass 
+0

私は、本質的に同じコードを毎回書き直すことなく、同じメソッド名を持つ異なるGraph実装に潜在的に渡すことができるようにしたいと考えています。これを行う方法はありませんか? – Tony

+1

@トニーはい、私が説明したように、あなたはそれらのクラスから継承します。 – Marcin

+1

@ Tony-実際には、「実際のコード」の行を書き直す必要はありません。 'Graph'クラスを継承すると、それらのメソッドがすべて取得されます。 –