(я знаю, что это старый вопрос, но так как он остается без ответа ...)
Вы можете попробовать возиться с сборщиком мусора .Я собирался предложить посмотреть на объекты уровня модуля, но некоторые быстрые эксперименты с кодом дали это: Попробуйте функцию gc.get_referrers(*objs)
.
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 0x7f3ec5540f90>, 'val': 4}, <frame object at 0x238c200>,
{'b': <__main__.Bar object at 0x7f3ec5540f90>,
'Bar': <class '__main__.Bar'>,
'f': <__main__.Foo object at 0x7f3ec5540f10>, # <-- these might be
# the droids you're looking for
'__builtins__': <module '__builtin__' (built-in)>,
'__package__': None, 'gc': <module 'gc' (built-in)>, '__name__': '__main__',
'Foo': <class '__main__.Foo'>, '__doc__': None
}]
Для получения бонусных баллов используйте gc.get_referents(*objs)
для тех, чтобы проверить, есть ли в их списке тот же b
.
Некоторые примечания / предостережения:
- Я думаю, вы должны просто передать родительский объект Foo в Bar, либо в
init
, либо в другом методе.Это то, что я бы сделал, вместо моего предложения выше. - Этот SO-ответ указывает на некоторые проблемы, которые возникают у сборщика мусора при соединении в обе стороны - в настоящее время вы делаете это не так, но если выдо, к твоему сведению.