我遇到了一个refcount问题,其中的对象不会被删除,因为有一个“不必要”的成员引用父(循环引用)。访问父对象而不引用它
这里的缩短版:
class User(object):
__slots__ = ("driver")
def __init__(self, *params):
self.driver = getDriverType(params)()
self.driver.parent = self
def getFancyObject(self):
return FancyObject(self)
class Driver(object):
def __init__(self):
self.parent = None
def specialCode(self):
self.parent.getFancyObject()
...
# driver-specific code doing something with fancyObject
为了驱动程序特定的东西,我还需要先进的功能,只有父母提供(再次,通过驱动程序提供的功能)。我可以在没有FancyObject实例的情况下执行,但是需要输入更多的代码。
当然,创建父引用可以防止父代和驱动程序被销毁,这不仅会占用Python VM中的RAM,还会占用该驱动程序处理的硬件资源。 Sunce的每个实例User
仍然存在,这会迅速升级为无响应的应用程序和内存不足异常。
不用说,__slots__
的User
类防止在该类上创建weakref.ref。
无可否认,我被包裹到这个问题中,我只是看不到一个很好的Pythonic解决方案。
如何在不创建可防止对象gc的引用的情况下实现所需的功能?
您是否可以在检索“幻想对象”后删除对父对象的引用? – BrenBarn 2014-09-05 08:18:52
不,因为我不知道什么时候需要调用FancyObject的功能。它可以被频繁地调用或者根本不被调用。 – velis 2014-09-05 08:46:08