2016-02-25 122 views
10

我有一個跟蹤其他幾個類的類。這些其他類中的每一個都需要訪問特定變量的值,並且這些其他類中的任何一個都必須能夠修改此特定變量,以便所有其他類都可以看到更改後的變量。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 

我希望它的工作方式如下:

>>> 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 

一切工作,我希望它除了最後3個命令。他們給:

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

爲什麼最後3個命令返回這些值?我該如何解決這個問題,以便他們返回所需的值?

感謝

+4

方式問一個很深思熟慮的,詳細的,具體與預期和觀察到的行爲問題上只有你的第二個問題的網站。做得太好了。 :) –

+3

旁註:如果你在Python27上,你的類應該繼承'object'。是的,同意@ g.d.d.c,寫得很好的問題。 – aneroid

+1

爲發佈什麼無框提供額外的上下文。這裏是關於Python 2.7的新樣式類的文檔:https://www.python.org/doc/newstyle/ – idjaw

回答

5

因此,看來你需要做的一切都是對你的類從object繼承:-)這讓你new-style classesall their benefits

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

對於對象,機器是object.__getattribute__()其轉換成b.xtype(b).__dict__['x'].__get__(b, type(b))

對於課程,機器在type.__getattribute__(),它將B.x轉換爲B.__dict__['x'].__get__(None, B)

(從 「應該記住的要點」)

  • __getattribute__()只適用於新的風格類和對象

  • object.__getattribute__()type.__getattribute__()作出__get__()不同的呼叫。

+1

如果您想添加更多信息,您可以添加我在OP註釋中發佈的文檔鏈接以獲取更多信息。 – idjaw

+1

謝謝,我正在尋找,引用相關部分。 – aneroid

+0

非常感謝您的幫助! – Bedlington