Как получить объект, создавший экземпляр класса

У меня следующая ситуация: у меня есть несколько классов, экземпляры которых создаются везде в моем приложении. Я хочу, чтобы каждый объект получил идентификатор от родительского объекта (говоря, что у меня есть объект B, а объект B создает экземпляр объекта C, тогда объект B является родителем объекта C, но объект C может быть также родительским для других объектов, я не говорю наследование).

Что я могу гарантировать, так это то, что все классы наследуются от одного и того же базового класса, скажем, класса rootobject, и я могу работать над этим.

Я действительно хочу избежать рефакторинга создания объектов, поскольку существует огромное количество классов. Передача аргумента self при создании экземпляра объекта невозможна, это занимает слишком много времени, если у вас большая база кода.

Я подумал о том, как посмотреть на кадры стека вызовов и попытаться получить оттуда класс, который создал экземпляр «меня». Это должен быть предыдущий кадр, но эта реализация слишком хакерская.

Любые идеи ?


person jt_reed    schedule 14.04.2015    source источник
comment
Как, во имя бога, это произошло?   -  person mistermarko    schedule 14.04.2015
comment
Проверка стека вызовов, вероятно, ваш лучший вариант. Будьте осторожны — вы легко можете сделать все свои объекты неудаляемыми — weakref ваш друг.   -  person tdelaney    schedule 14.04.2015
comment
Под объектом B создается экземпляр объекта C. Вы имеете в виду, что C создается из метода класса B, где self = B?   -  person shx2    schedule 14.04.2015
comment
Вероятно, это проблема XY. Пожалуйста, объясните, почему вы хотите это сделать.   -  person shx2    schedule 14.04.2015


Ответы (1)


Это очень хакерское, но рабочее решение:

import inspect

def get_instantiator():
    # The instantiator is two frames back.
    frame = inspect.currentframe().f_back.f_back
    frame_args = inspect.getargvalues(frame)
    return frame_args.locals[frame_args.args[0]]

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

class B:
    def __init__(self):
        self.parent = get_instantiator()

a = A()
print(a.b.parent == a)

Он находит аргумент self, переданный в инстанцирующий класс.

person orlp    schedule 14.04.2015