В Python, как разделить (ссылку) переменной в качестве атрибутов для разных объектов? - PullRequest
0 голосов
/ 05 октября 2019

Итак, у меня есть основной класс и несколько вспомогательных классов. В методах основного класса мне понадобятся некоторые вспомогательные объекты, с которыми я хочу «поделиться» атрибутом 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

1 Ответ

1 голос
/ 05 октября 2019

Все хорошо, кроме этой части:

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
...