4

プロジェクトでPythonを選択しようとしていますが、抽象化とクラスの使用方法について少し混乱しています。(私はあまり経験豊富なプログラマーではないので、この質問の基本レベルについてお詫びします。)私はJava / Ocamlのバックグラウンドを持っており、私がやろうとしていることは次のとおりです。グラフの抽象クラスがあります。そして、graphadvanced(いくつかのより凝った方法を備えたグラフ)は、このように見えます

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

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

次に、グラフを実装します。

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

今私の質問は:私はこのようなことをすることができますか?

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

言い換えると、AbstractGraphのメソッドの観点からAdvancedのメソッドを抽象的に定義し、次にGraphをコンストラクターに渡して、Graphの実装でAdvancedの定義を使用するAdvancedのインスタンスを取得するにはどうすればよいですか?

Ocamlに関しては、AbstractAdvancedとAbstractGraphをモジュールタイプとして処理しようとしていますが、Pythonで少し遊んだことがあり、これを機能させる方法がわかりません。

4

1 に答える 1

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
于 2012-04-15T15:19:56.443 に答える