Python对象属性共享

时间:2016-02-25 18:36:30

标签: python python-2.7

我有一个跟踪其他几个课程的课程。这些其他类中的每一个都需要访问特定变量的值,并且这些其他类中的任何一个也必须能够修改此特定变量,以便所有其他类可以看到更改的变量。

我尝试使用属性来完成此操作。一个例子如下:

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个命令会返回这些值?如何解决这个问题,以便返回所需的值?

由于

1 个答案:

答案 0 :(得分: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.x转换为type(b).__dict__['x'].__get__(b, type(b))

     

对于课程,机制位于type.__getattribute__(),将B.x转换为B.__dict__['x'].__get__(None, B)

     

(来自"要记住的要点")

     
      
  • __getattribute__()仅适用于新的样式类和对象

  •   
  • object.__getattribute__()type.__getattribute__()拨打__get__()的不同电话。

  •