我有一个类Foo
,它在我的程序序列中无限次地实例化。像这样:
def main():
f = Foo()
while f.run():
del f
f = Foo()
run()
是一种运行决定性条件的方法,可以使程序保持活动状态。
现在,我的Foo
类在其__init__
方法上创建了两个对象a
和b
:
Foo class
class Foo:
def __init__(self):
a = A()
b = B(a.var)
我正在寻找一种方法a
仅在第一个Foo
实例化时声明,并在另一个地方使用相同的第一个实例a
Foo
实例化。
出现问题是因为b
取决于a
。我考虑了几个解决方案 - 从使用__new__
和__init__
覆盖__del__
和全局变量作为缓存 - 但它们都没有工作。
注意:A
需要与Foo
位于同一模块
答案 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
变量,您实际上正在删除对旧实例的引用,该实例最终将被垃圾回收。