我有两个不同类的对象。什么是合理的设计选择,使一个属性反映另一个的变化?下面显示了一个不起作用的天真解决方案,希望能够说明目标:
具体做法是:
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))
答案 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]))
或者你可以将两者合并,然后尝试隐藏用户的实现,但这很容易让人感到误解。