Передать переменные по ссылке на dict? - PullRequest
0 голосов
/ 03 мая 2020

Я хочу выполнить sh следующее:

У меня есть класс X и много других других классов (A, B, C, ...). У класса X есть метод, с помощью которого все другие классы могут публиковать sh некоторых своих переменных в классе X.

В классе X я хочу собрать все эти переменные в словаре.

Я хочу, чтобы в этом словаре всегда было текущее значение переменных, которые были переданы другим классом, без повторной публикации переменной speci c из другого класса .

Пример:

class X:
    def __init__(self):
        self.d = {}

    def add_to_dict(self, var_name, var):
        # obviously this is the point, where it fails - I want somehow that a 
        # reference to var gets added to the dict, and not just a copy of var
        self.d[var_name] = var   


class A:
    def __init__(self, instance_of_X):
        self.var = 5    # variable which gets updated regularly within A
        self.instance_of_X = instance_of_X

    def publish(self):
        # I want all value changes of var to also be present in X, without
        # updating it by myself
        self.instance_of_X.add_to_dict('var_name', self.var)    

Ответы [ 2 ]

1 голос
/ 03 мая 2020

Вы не можете иметь ссылки на такие переменные в Python. Однако можно смоделировать эффект, отслеживая интересующий объект и имя атрибута, и использовать его в сочетании с дескриптором @property для вызова функции, которая будет извлекать текущее значение атрибутов, когда они необходимы. .

Вот что я имею в виду:

class X:
    def __init__(self):
        self._d = {}

    def add_to_dict(self, alias, obj, attr_name):
        self._d[alias] = lambda: getattr(obj, attr_name)  # Function to retrieve attr value.

    @property
    def d(self):
        return {alias: get_obj_attr() for alias, get_obj_attr in self._d.items()}


class A:
    def __init__(self, instance_of_X):
        self.var = 5  # Variable which gets updated regularly within A.
        self.instance_of_X = instance_of_X

    def publish(self):
        self.instance_of_X.add_to_dict('var_alias', self, 'var')


x = X()
a = A(x)
a.publish()
print(x.d)  # -> {'var_alias': 5}
a.var = 42
print(x.d)  # -> {'var_alias': 42}
0 голосов
/ 03 мая 2020

Попробуйте:

class X:
    def __init__(self):
        self.d = {}

    def add_to_dict(self, var_name, var):
        # obviously this is the point, where it fails - I want somehow that a
        # reference to var gets added to the dict, and not just a copy of var
        self.d[var_name] = var


class A:
    def __init__(self, instance_of_X):
        self.var = 5    # variable which gets updated regularly within A
        self.instance_of_X = instance_of_X

    def publish(self):
        # I want all value changes of var to also be present in X, without
        # updating it by myself
        self.instance_of_X.add_to_dict('var_name', self.var)


x = X()
a = A(x)
a.publish()
print(x.d)

Объяснение: Вы должны задать атрибуты var и instance_of_X для A, см. Новый конструктор класса A. Вызов instance_of_X в A.publish() конечно, также необходимо использовать атрибут.

...