你的實際問題是,你想要的行爲類似於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