你的实际问题是,你想要的行为类似于C++中的引用调用。为了达到这个目的,你可以做的就是用一些小技巧来模拟一个内存位置。 Found here这个工作原因可以在this questions accepted answer找到,它与Pythons可变和不可变对象有关。
class ref:
def __init__(self, obj): self.obj = obj
def get(self): return self.obj
def set(self, obj): self.obj = obj
class B:
def __init__(self, msg):
self.msg = msg
class A:
def __init__(self, msg):
self.msg = ref(msg)
self.b = B(self.msg)
def update(self, msg):
self.msg.set(msg)
a = A('hello')
print a.msg.get() #hello
print a.b.msg.get() #hello
a.update('bye')
print a.msg.get() #bye
print a.b.msg.get() #bye
但如果这意味着你的代码太多的变化,你也可以做的是在每一个功能定义一个方法msg(self)
用msg
,重命名msg
到message
或什么的。 这样你就可以通过调用a.msg()
来获得字符串,例如对现有代码的更改较少。但是我担心没有任何改变你的代码的办法来解决你的问题。
样品两种,配有msg()
方法:
class B:
def __init__(self, msg):
self.message = msg
def msg(self):
return self.message.get()
class A:
def __init__(self, msg):
self.message = ref(msg)
self.b = B(self.message)
def update(self, msg):
self.message.set(msg)
def msg(self):
return self.message.get()
a = A('hello')
print a.msg() #hello
print a.b.msg() #hello
第三种解决方案,我看是使用一个List
,而不是引用类:
class B:
def __init__(self, msg):
self.msg = msg
class A:
def __init__(self, msg):
self.msg = [msg]
self.b = B(self.msg)
def update(self, msg):
self.msg[0] = msg
a = A('hello')
print a.msg[0] #hello
print a.b.msg[0] #hello
a.update('bye')
print a.msg[0] #bye
print a.b.msg[0] #bye
一般来说,你可以使用任何其他但请注意,您不能重新分配某些“子类”中的可变对象,如B
在您的示例中。
他们是否是字符串? – wnnmaw
在'update'方法中添加'self.b.msg = msg'? –
@IsmailBadawi:这是我想避免的。我希望自动发生,而不是手动强制。背景是,我可以使用父数据的很多子对象作为缓存属性,我甚至无法枚举。 – dangonfast