删除类时保持对象引用?

时间:2018-04-16 22:57:38

标签: python class oop pygame

我有一个类Foo,它在我的程序序列中无限次地实例化。像这样:

def main():
    f = Foo()
    while f.run():
        del f
        f = Foo()

run()是一种运行决定性条件的方法,可以使程序保持活动状态。

现在,我的Foo类在其__init__方法上创建了两个对象ab

Foo class

class Foo:
    def __init__(self):
        a = A()
        b = B(a.var)

我正在寻找一种方法a仅在第一个Foo实例化时声明,并在另一个地方使用相同的第一个实例a Foo实例化。

出现问题是因为b取决于a。我考虑了几个解决方案 - 从使用__new____init__覆盖__del__和全局变量作为缓存 - 但它们都没有工作。

注意A需要与Foo位于同一模块

3 个答案:

答案 0 :(得分:2)

也许使用类变量?

class Foo:
    a = None
    def __init__(self):
        if not Foo.a:
            Foo.a = A()
        b = B(Foo.a.var)

功能B需要检查a是否为None。

答案 1 :(得分:1)

如果我理解正确,你应该能够a成为一个类变量。

class Foo:
    a = A()

    def __init__(self):    
        b = B(Foo.a.var)

答案 2 :(得分:1)

我担心你的一些要求会使Foo极难测试。相反,我建议您将一些依赖项从构造函数移动到start类方法,该方法负责创建初始A实例(与Foo在同一模块中)然后在refresh方法中重用该实例。

class Foo:
    def __init__(self, a, b):
        self.a = a
        self.b = b

    @classmethod
    def start(cls):
        a = A()
        b = B(a.var)
        return cls(a, b)

    def refresh(self):
        b = B(self.a.var)
        return self.__class__(self.a, b)

然后,您的main函数看起来像:

def main():
    f = Foo.start()
    while f.run():
        f = f.refresh()

通过覆盖f变量,您实际上正在删除对旧实例的引用,该实例最终将被垃圾回收。