在类之间共享实例变量

时间:2019-07-08 16:03:20

标签: python class-design weak-references

我有两个类A和B,我想将A的实例变量共享给B,并确保当我在A中的变量上调用del时,B不再可以访问它并且该变量可以正确访问删除。

我已经想到了4种不同的方法来实现这一目标。

  1. 继承-我反对这样做,因为B不是A的实例,并且在调用super时遇到问题(B恰好是其他ABC的派生类)。 B也没有使用A中定义的其他变量和方法。
  2. 嵌套类-我尝试过,但显然python嵌套类的行为不像C ++那样。
  3. 传递变量-最初按预期运行,但是当我在A中的变量上调用del时,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 ...

上面是传递变量的示例。当我在A的实例上调用stop时,该变量未正确删除。

1 个答案:

答案 0 :(得分:0)

仅使用程序设计(例如继承或嵌套类)来查找解决方案可能会比较棘手且难以阅读,但很可能是这样。您可以使用全局变量,但这将是代码的味道。话虽如此,我将在此处添加一个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