在python中,如何跨不同对象共享(引用)变量作为属性?
所以我有一个主类和几个辅助类。在主类的方法中,我需要一些辅助对象,我想用它们“共享”主实例的在python中,如何跨不同对象共享(引用)变量作为属性?,python,class,reference,pass-by-reference,Python,Class,Reference,Pass By Reference,所以我有一个主类和几个辅助类。在主类的方法中,我需要一些辅助对象,我想用它们“共享”主实例的shared_data属性,这样每当我更改主对象的shared_data属性时,辅助对象对应的属性也会相应地更新。(为了具体起见,您可以将共享的_数据视为“时间”,我希望“时间”属性在各个对象之间保持同步) 但是,以下面的简单方式这样做似乎不起作用,因为这样做实际上不会在对象之间“共享”数据,而只是将当前值分配给这些对象,因此这些对象属性不会保持同步。实现这种“同步”或“共享”功能的正确方法应该是什么 主
shared_data
属性,这样每当我更改主对象的shared_data
属性时,辅助对象对应的属性也会相应地更新。(为了具体起见,您可以将共享的_数据
视为“时间”,我希望“时间”属性在各个对象之间保持同步)
但是,以下面的简单方式这样做似乎不起作用,因为这样做实际上不会在对象之间“共享”数据,而只是将当前值分配给这些对象,因此这些对象属性不会保持同步。实现这种“同步”或“共享”功能的正确方法应该是什么
主类:
定义初始化(自共享数据):
self.shared_data=共享_数据
通过
def do_材料(自身):
#初始化辅助对象(仅一次)。
#希望更改self.x1时,中的数据
#对象aux1、aux2也将反映这一变化
aux1,aux2=aux1(自共享_数据),aux2(自共享_数据)
#但是,一般来说,更改self.shared_数据不会
#更改aux1或aux2中的数据
另一个_值=。。。
self.shared_data=另一个_值#不起作用
通过
Aux1类:
定义初始化(self,x1):
self.x1=x1
...
通过
Aux2类:
定义初始(自我,x2):
self.x2=x2
...
通过
除了这部分,一切都很好:
self.shared_data = another_value # doesn't work
该行不修改共享值
。它只是为保存共享数据对象之前的变量分配了一个不同的对象
您需要做的是修改共享值,例如:
self.shared_value.data = another_data
下面是一个完整的示例:
class SharedData:
def __init__(self):
self.time = 0
self.colour = "red"
class ObjectWithSharedData:
def __init__(self, shared_data):
self._shared_data = shared_data
def do_stuff(self):
self._shared_data.time = 7
def get_time(self):
return self._shared_data.time
shared_data = SharedData()
a = ObjectWithSharedData(shared_data)
b = ObjectWithSharedData(shared_data)
c = ObjectWithSharedData(shared_data)
a.do_stuff()
print(a.get_time()) # prints 7
print(b.get_time()) # prints 7
print(c.get_time()) # prints 7
IIRC,例如,如果共享数据是
time
,那么我可能想创建一个类时钟:def\uu init\uuu(self,time):self.time=time
,然后修改Clock.time
,而不是重新分配时钟?(或者更确切地说,只是共享时钟而不是共享时间)是的,共享时钟并修改时钟。时间也可以。我可以问一个后续问题:Python是否只在内存中创建一个共享的数据,在不同的对象之间共享它只需创建对它的引用,而不需要额外的内存使用?现在让我们假设共享的_数据
很大,跨多个对象共享会导致显著的内存开销吗?谢谢将shared_data
分配给多个变量只会创建对同一数据的多个引用,因此每个变量只使用几个字节。数据不会被复制。