在不同类型的对象之间同步属性

时间:2018-04-13 00:48:09

标签: python python-3.x oop properties attributes

我有两个不同类的对象。什么是合理的设计选择,使一个属性反映另一个的变化?下面显示了一个不起作用的天真解决方案,希望能够说明目标:

具体做法是:

class A(object):
     def __init__(self):
         self.x = 'a original string'

class B(object):
     def __init__(self):
         self.x = 'b original string'

a = A()
b = B()

b.x = a.x
a.x = 'a modified string'

print('b.x = "{}" was not modified when a.x = "{}" was changed'.format(b.x, a.x))

1 个答案:

答案 0 :(得分:1)

你真正要求的是一种让b.x成为对变量a.x的某种引用的方法,这对Python变量的工作方式没有意义 - 变量不是'在Python中的t值,它们只是名称。

通常,它们都不合适,答案是合理的设计选择是首先不要这样做。

但是当你需要时,有一些方法可以模拟这个。哪一个 - 如果有的话 - 适当取决于你真正想要做的事情;以玩具为例,它们都没有多大意义。所以我只会展示一对。

最明显的方法是明确保留a和名称'x'

class B:
    def __init__(self):
        self._x = 'b original string'
        self._a = None
    def set_a(self, a):
        self._a = a
    @property
    def x(self):
        if self._a is None:
            return self._x
        else:
            return self.a.x

a = A()
b = B()

b.set_a(a)
a.x = 'a modified string'

print('b.x = "{}" was modified when a.x = "{}" was changed'.format(b.x, a.x))

或者您可以使用“可变持有者”替换字符串 - 最简单的选项是单元素列表 - 然后您可以改变名称绑定的持有者,而不是将名称重新绑定到不同的名称:< / p>

class A(object):
     def __init__(self):
         self.x = ['a original string']

class B(object):
     def __init__(self):
         self.x = ['b original string']

a = A()
b = B()

b.x = a.x
a.x[0] = 'a modified string'

print('b.x[0] = "{}" was modified when a.x[0] = "{}" was changed'.format(b.x[0], a.x[0]))

或者你可以将两者合并,然后尝试隐藏用户的实现,但这很容易让人感到误解。