2016-03-19 5 views
0

私は厳密な 'has-a'関係でクラスBを含むクラスAを持っています。 AにはBが含まれているのは理にかなっていますが、Bにはいくつかの具体的なメソッド呼び出ししかありません。ほとんどの部分のモデリングでは、クラスAのメソッドには実際のメリットがなく、 2つの関数呼び出しの欠点。構成OOP

class A(): 

    b=B() 

    __init__(self): 
     self.a=[] 

    def addToA(self,a): 
     self.a.append(a) 

    def addToB(a): 
     # do something with self.a 
     b.addToB(a) 

それはB.しかし、直接それ以外の場合はBに行く変更したときに特に必要とされている内のメソッドを提供する上で、人々の考えは何ですか:

z=A() 
z.addToB(a) 
z.b.methSpecificToB(x,y,z) 

私は私はカプセル化を壊すんだよ感じますこれをやっているだけですが、余計なメソッドを用意するのではなく、より意味をなさせるものです。

+0

'b 'は' self.b'で、 'addToB()'は 'self'を最初の記念碑とするべきでしょうか? –

+0

こんにちはMartin、bはクラス属性であるため、すべてのインスタンスで共有する必要があります。私は実際のコードでこのコードを単純化しましたが、クラスBは実際にはデータベースのライブラリです... –

答えて

1

私は一般に、メソッドの呼び出しを間接的に優先します。 AとBの後で変更する場合はmethodSpecificToBとBの他のメソッドが呼び出されますが、A.addtoBは変更する必要がありますが、Zや他のクラスがBを直接呼び出す場合はすべて変更する必要があります。

最終的には、Bの変更の可能性に依存します。もしそれが起こらないなら、Bを公開するのはおそらく大丈夫ですが、可能であれば間接指定はより安全です。

+0

ありがとうSnakecharmerはいそうです。私はこれに向かって傾いていた。 –

0

@propertyデコレータでこれを解決します。 A.Bを設定すると、自動的にB.Aが設定されます。ここでは何が起こる

class A: 

    _b = None 

    @property 
    def b(self): 
     return self._b 

    @b.setter 
    def b(self, b): 
     self._b = b 
     b.a = self 

class B: 

    a = None 

foo = A() 
bar = B() 
foo.b = bar 
bar.a == foo # True 
foo.b == bar # True 

あなたがfoo.bを設定すると、それはfoo._bとして保存されていることです。 (アンダースコアは内部的に一般的に使用される「隠れた」変数を示します)同時に、bar.afooに設定され、barからfooにアクセスすることができます。

foo.bにアクセスしようとすると、代わりにfoo._bが返されます。これを先にbarに設定したので、barfooからアクセスします。

Pythonのプロパティには多くのチュートリアルがあります。 This oneは問題ありません。