2011-10-17 6 views
4

私はこれらの線に沿って何かやろうとしている:このコードは、このエラーが発生します予想通りPythonの設計:OOP

class A: 

    def __init__(self, x=None, y=None): 
     self.x = x 
     self.y = y 

class B(A): 

    def do_something_in_Bs_context(self): 
     print "In B" 

class C(A): 

    def do_something_in_Cs_context(self): 
     print "In C" 


a = A(1,2) 
b = B.do_something_in_Bs_context(a) 
c = C.do_something_in_Cs_context(a) 

を:

TypeError: unbound method do_something_in_Bs_context() must be called with B instance as first argument (got A instance instead) 

この設計の根本的な理由は、Aということですデータのコンテナ(テーブルなど)であり、BとCはAの操作セットです.BとCの両方が同じデータで動作しますが、概念的には同じデータに対して実行できる別個の操作セットです。私はAの中のBとCのすべての操作を練習することができましたが、私は概念の分離を作りたいと思います。 (例としてテーブル上で、私は微積分または三角法と言うようにグループ化することができる異なる演算のセットを実行することができますので、A:テーブル、B:微積分、C:三角法)

これは、 View Controllerのパラダイムが少し歪んでいる。

Iは、次の解決策を思い付いた:

  1. B及びCは、概念的に異なるクラスAのインスタンスへの参照を維持し は、そのインスタンス上で動作する( ビュー/コントローラ)として実装されています。 AにB及びCだけグループ化 方法ので
  2. 、私は多くのこれらの溶液のいずれかを好きではないA.

のインスタンス上で動作する機能を持つモジュールを作成(2僅かにより良好1 )、しかし、私はこの問題を解決するためのより良い/クリーナー/もっとpythonic方法があるかどうかわからない。すべてのポインタ?

+0

私は、私たちにはTypeErrorを示すのポイントは何であったかはわからないので、私は私の答えでそれを無視します。 –

+0

1&2は完全に慣れているようです。いくつかの関数をまとめてグループにまとめたい場合は、クラスを作成しないでください。 – delnan

答えて

6

私が質問を理解する方法は次のとおりです。BおよびCは、タイプAのデータを消費する関数のコレクションです。あなたがしたいことは、機能を論​​理的にグループ化することです。

私は、次のいずれかを実行してお勧めしたい:

  1. A年代を操作するクラスBCに機能を分離 - これは、HAS-関係です。関数/メソッドは静的なことができることは、あなたが
  2. はトップレベルの関数定義に

を作成し、モジュールBCに機能を分離に必要なものだと、私は、継承はこの問題の悪い解決策になると思います。私はIS-Aの関係はないと思う。

+3

私は関数を持つモジュールは静的メソッドよりPythonに近いと思いますが、同意します。 –

1
追加クラスの

移動状態とそのインスタンスの属性を作る:

class State(object): 
    def __init__(self, x=None, y=None): 
     self.x = x 
     self.y = y 

class A(object): 
    def __init__(self, state=None): 
     self.state = state 

class B(A): 
    def __init__(self, state=None): 
     super(B, self).__init__(state) 

    def do_something_in_Bs_context(self): 
     print self.state.x 

class C(A): 
    def __init__(self, state=None): 
     super(C, self).__init__(state) 

    def do_something_in_Cs_context(self): 
     print self.state.y 

s = State(1, 2) 
b = B(s) 
c = C(s) 
b.do_something_in_Bs_context() 
c.do_something_in_Cs_context() 
関連する問題