Совместное использование переменной экземпляра между классами - PullRequest
1 голос
/ 08 июля 2019

У меня есть два класса A и B, и я хочу поделиться переменной экземпляра от A до B и убедиться, что, когда я вызываю del для переменной в A, B больше не имеет доступа к ней, и переменная становится правильно Исключен.

Я имел в виду 4 различных метода для достижения этой цели.

  1. Наследование - я решил против этого, потому что B не является экземпляром A, и у меня возникают проблемы при вызове super (B оказывается производным классом некоторой другой ABC). B также не имеет смысла для других переменных и методов, определенных в A.
  2. Вложенные классы - я пробовал это, но очевидно, что вложенные классы Python не ведут себя так, как это делает C ++.
  3. Передача переменных - Первоначально это работало, как и ожидалось, но когда я вызвал del для переменной в A, B все еще имел доступ к ней, потому что (я полагаю) она все еще имела ссылку на переменную
  4. Глобальные переменные - я слышал, что это плохая практика

Я знаю, что, вероятно, есть решение с weakref, но мне было интересно, есть ли другое решение, связанное с дизайном программы

class A():
    def __init__(self):
         self.var = myVar
    def func(self):
         return B(self.myVar2)
    def stop(self):
         del self.myVar
class B():
    def __init__(self, myVar)
        self.myVar2 = myVar
    # Other methods ...

Выше приведен пример передачи переменной. Когда я вызываю stop для экземпляра A, переменная не удаляется должным образом.

1 Ответ

0 голосов
/ 08 июля 2019

Поиск решения с использованием только проектирования программы (например, наследования или вложенных классов) может быть сложным и трудным для чтения, но, скорее всего, возможно.Вы можете использовать глобальную переменную, но это будет запах кода.При этом я добавлю weakref решение здесь, пока не будет добавлено другое решение.

import weakref

class A:
    def __init__(self):
        pass
    def __repr__(self):
        return "Instance of A"

class B:
    """
    Wants a weak reference to an instance of A
    """
    def __init__(self, instance_of_a):
        self._a = weakref.ref(instance_of_a)

    @property
    def a(self):
      return self._a()


a_inst = A()
b_inst = B(a_inst)

print(b_inst.a) # Instance of A
del a_inst
print(b_inst.a) # None
...