2017-04-26 9 views
0

への参照を持つ2つのクラスをインスタンス化、BおよびC私は2つのクラスを持って互いに

IはB参照してCリファレンスとCとBをインスタンス化します。

私はsetterメソッドを追加することもできますが、私はそれが原因鶏と卵の状況に直接__init__内で可能ではありませんのinitステージや他のエレガントな方法で

+1

あなたは何をすべきか平均*正確に?それはかなり簡単ですね...しかし、Pythonでgetterとsetterを使うべきではありません。 –

+0

'a = A(); b = B(); a.b、b.a = b、a ' –

+0

ok? Cを作成する前に、どのようにCのリファレンスをBに渡すことができますか? –

答えて

1

をそれを行うことができればと思いまして。しかし、それは1つの割り当て文で可能です:

>>> class A: 
...  pass 
... 
>>> class B: 
...  pass 
... 
>>> a, b = b.a, a.b = A(), B() 
>>> a.b is b 
True 
>>> b.a is a 
True 

これは、Pythonは、左から右への割り当てを評価しているという事実に依存しています。

not thread safeです。参照がスレッド化されたアプリケーションに存在することを保証する必要がある場合は、可能な競合条件を処理するためにmutexを使用することが望ましいでしょう。 GILはopcodeレベルで動作します。これはPythonコードの行より細かい解像度です。

+0

両方のコンストラクタへの参照も同時に渡すことはできませんが、もちろん不可能です。 –

+2

@JoshLeeそれは馬鹿げた程度に髪を分割しています。原子操作でさえ、2つのことを同時に行うことはありません。 –

+0

@AdamSmithちょうど明確にする。質問される特定の質問は不可能ですが、それに答えるためのさまざまな創造的な方法があります。 –

1

あなたは、クラス初期化子の一つは、他のクラスのオブジェクトを取る作る場合は、__init__でそれを行うことができます:

__init__に引数なしで
>>> class B: 
... def __init__(self): 
...  self.c = C(self) 
... 
>>> class C: 
... def __init__(self, b): 
...  self.b = b 
... 
>>> b = B() 
>>> c = b.c 
>>> b.c 
<__main__.C object at 0x107a4f6d8> 
>>> b.c.b.c 
<__main__.C object at 0x107a4f6d8> 
>>> b.c.b.c.b 
<__main__.B object at 0x107a60e80> 
>>> b 
<__main__.B object at 0x107a60e80> 
>>> c 
<__main__.C object at 0x107a4f6d8> 
>>> c.b 
<__main__.B object at 0x107a60e80> 
>>> b.c 
<__main__.C object at 0x107a4f6d8> 
>>> b.c.b.c 
<__main__.C object at 0x107a4f6d8> 
>>> c.b.c.b 
<__main__.B object at 0x107a60e80> 

あるいは:

>>> class B: 
...  def __init__(self): 
...   self.c = C() 
...   self.c.b = self 
... 
>>> class C: 
...  pass 
... 
>>> b = B() 
>>> c = b.c 
>>> b 
<__main__.B object at 0x10835c048> 
>>> c 
<__main__.C object at 0x1085ccac8> 
>>> b.c 
<__main__.C object at 0x1085ccac8> 
>>> c.b 
<__main__.B object at 0x10835c048> 
>>> b.c.b.c.b 
<__main__.B object at 0x10835c048> 
関連する問題