2016-02-25 10 views
10

私は他のいくつかのクラスを追跡するクラスを持っています。これらの他のクラスはそれぞれ、特定の変数の値にアクセスする必要があり、これらの他のクラスのうちのいずれか1つは、この特定の変数を変更して、他のすべてのクラスが変更された変数を見ることができるようにする必要があります。Pythonオブジェクトのプロパティの共有

これをプロパティを使用して実行しようとしました。次のように例を示します。

class A: 
    def __init__(self, state): 
     self._b_obj = B(self) 
     self._state = state 

    @property 
    def state(self): 
     return self._state 

    @state.setter 
    def state(self,val): 
     self._state = val 

    @property 
    def b_obj(self): 
     return self._b_obj 

    @b_obj.setter 
    def b_obj(self,val): 
     self._b_obj = val 


class B: 
    def __init__(self, a_obj): 
     self.a_obj = a_obj 

    @property 
    def state(self): 
     return self.a_obj.state 

    @state.setter 
    def state(self,val): 
     self.a_obj.state = val 

私は次のように仕事をしたい:私はそれが最後の3つのコマンドを除くたいと

>>> objA = A(4) 
>>> objB = objA.b_obj 
>>> print objA.state 
4 
>>> print objB.state 
4 
>>> objA.state = 10 
>>> print objA.state 
10 
>>> print objB.state 
10 
>>> objB.state = 1 
>>> print objA.state 
1 
>>> print objB.state 
1 

すべてが動作します。彼らは与える:

>>> objB.state = 1 
>>> print objA.state 
10 
>>> print objB.state 
1 

なぜこれらの値を最後の3つのコマンドが返すのですか?どのように私はこれを修正して、彼らが希望の値を返すことができますか?

おかげ

+4

ウェイ。非常によくやりました。 :) –

+3

Sidenote:Python27を使用している場合、クラスは 'object'を継承する必要があります。そしてはい、@ g.d.d.c、非常によく書かれた質問に同意した。 – aneroid

+1

アネロイドが投稿した内容に追加のコンテキストを提供する。 Python 2.7用の新しいスタイルクラスに関するドキュメントは次のとおりです:https://www.python.org/doc/newstyle/ – idjaw

答えて

5

だから、あなたが行うために必要なすべてはそれがあなたにnew-style classesall their benefitsを与える:-)あなたのクラスはobjectを継承していているようです。

class A(object): 
    ... # rest is as per your code 

class B(object): 
    ... # rest is as per your code 

>>> objA = A(4) 
>>> objB = objA.b_obj 
>>> print objA.state 
4 
>>> print objB.state 
4 
>>> objA.state = 10 
>>> print objA.state 
10 
>>> print objB.state 
10 
>>> objB.state = 1 
>>> print objA.state 
1 
>>> print objB.state 
1 

これが唯一の新しいスタイルのクラスで動作する理由について具体的な理由、from hereは:オブジェクトの場合

、機械がtype(b).__dict__['x'].__get__(b, type(b))b.xを変換object.__getattribute__()です。

クラスの場合、機械はtype.__getattribute__()にあり、B.xB.__dict__['x'].__get__(None, B)に変換します。 ( "覚えておくべき重要なポイント" から)

  • __getattribute__()新スタイルクラスでのみ使用可能で、

  • object.__getattribute__()type.__getattribute__()__get__()に異なる呼び出しを行うオブジェクト。サイトにのみ、あなたの第二の問題の両方に期待して観察された挙動と本当によく考え抜か、詳細、具体的な質問をする

+1

もう少し詳しい情報を追加したい場合は、OPコメントに追加したドキュメントリンクを追加することができます。 – idjaw

+1

ありがとう、私はちょうど、関連するセクションを引用するためにそれを探していた。 – aneroid

+0

ありがとうございます。 – Bedlington

関連する問題