在python中,如何在不同对象之间共享变量(作为参考)作为属性?

问题描述 投票:0回答:1

所以我有一个主班和几个辅助班。在主类的方法中,我将需要一些辅助对象,我想与这些辅助对象“共享”主实例的shared_data属性,以便每当更改主对象的shared_data属性时,辅助对象的对应对象属性也会相应地更新。 (具体来说,您可能会认为shared_data为“时间”,我希望“时间”属性在各个对象之间保持同步)。

但是,似乎无法以下面的幼稚方式执行此操作,因为这实际上不会跨对象“共享”数据,而是仅将当前值分配给这些对象,因此这些对象属性将不会保留已同步。实现此“同步”或“共享”功能的正确方法应该是什么?

class Main:

    def __init__(self, shared_data):
        self.shared_data = shared_data
        pass

    def do_stuff(self):
        # initialise auxiliary objects (only for once).
        # hopefully when self.x1 is changed, the data in
        # the objects aux1, aux2 will also reflect this change
        aux1, aux2 = Aux1(self.shared_data), Aux2(self.shared_data)

        # however, in general, changing self.shared_data would not
        # change the data in aux1 or aux2
        another_value = ...
        self.shared_data = another_value    # doesn't work

        pass


class Aux1:

    def __init__(self, x1):
        self.x1 = x1
        ...
        pass


class Aux2:

    def __init__(self, x2):
        self.x2 = x2
        ...
        pass

python class reference pass-by-reference
1个回答
1
投票

除了这部分,一切都很好:

self.shared_data = another_value    # doesn't work

该行不会修改shared_value。它只是为持有共享数据对象之前的变量分配了一个不同的对象。

您需要做的是修改shared_value,例如这样:

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
© www.soinside.com 2019 - 2024. All rights reserved.