Python对象属性共享

10

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

我尝试使用属性来实现这一点,以下是一个示例:

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

除了最后三个命令,一切都按照我的要求工作。它们会给出:

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

为什么最后三个命令返回这些值?我该如何修复它们以使其返回想要的值?

谢谢。


4
你在第二个问题中提出了一个非常深思熟虑、详细、具体的问题,并陈述了预期和观察到的行为。做得非常好。 :) - g.d.d.c
3
附注:如果您使用的是Python27,则您的类应该继承object。另外,同意@g.d.d.c的观点,这是一个非常写得好的问题。 - aneroid
1
为了提供更多关于aneroid发布内容的背景信息,这里是Python 2.7新式类的文档:https://www.python.org/doc/newstyle/。 - idjaw
除了我没有意识到那是他/她的代码失败的唯一原因。 - aneroid
1个回答

5
看起来你只需要让你的类继承自 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

这只能使用新式类才能正常工作,原因如下(从这里)
对于对象,机制在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__()的方式不同。

1
如果您想添加更多信息,可以在原始帖子的评论中添加我发布的文档链接以获取额外信息。 - idjaw
1
谢谢,我正想找到那个引用相关部分的内容。 - aneroid
非常感谢您的帮助! - Bedlington
不客气。我已经添加了一些信息,它只能与新式类一起使用。 - aneroid

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接