(我知道这是一个老问题,但既然没有答案……)
你可以试着搞乱garbage collector。我们打算建议查看模块级对象,但是一些快速的代码实验给出了这个建议:尝试^{}函数。import gc
class Foo(object):
"""contains Bar"""
def __init__(self, val):
self.val = val
self.bar = None
class Bar(object):
"""wants to find its parents"""
def __init__(self, something):
self.spam = something
def find_parents(self):
return gc.get_referrers(self)
结果并不简单,因此您必须应用自己的逻辑来确定您要查找的是哪个f。注意下面的'f': <__main__.foo object at ...>:>>> f = Foo(4)
>>> b = Bar('ham')
>>> f.bar = b
>>> b.find_parents()
[{'bar': <__main__.bar object at>, 'val': 4}, ,
{'b': <__main__.bar object at>,
'Bar': ,
'f': <__main__.foo object at>, #
# the droids you're looking for
'__builtins__': ,
'__package__': None, 'gc': , '__name__': '__main__',
'Foo': , '__doc__': None
}]
对于加分,使用^{}来检查列表中是否有相同的b。
一些注意事项:我认为您应该只将父Foo对象传递给Bar,要么在init中,要么在另一个方法中。这就是我要做的,而不是我上面的建议。
This SO answer指出了垃圾收集器在双向链接时存在的一些问题-您目前没有这样做,但如果这样做了,仅供参考。