2016-02-25 139 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