在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
分配给多个变量只会创建对同一数据的多个引用,因此每个变量只使用几个字节。数据不会被复制。