如何获取实例化类的对象

时间:2015-04-14 18:43:00

标签: python cpython

我有以下情况:我有多个类在我的应用程序中到处实例化。我希望每个对象从父对象获取一个id(说我有对象B,对象B实例化对象C,然后对象B是对象C的父对象,但对象C也可以是其他对象的父对象,我不是在说话继承)。

我能保证的是,所有类都继承自同一个基类,让我们说rootobject类,我可以解决这个问题。

我真的想避免重构对象实例化,因为有大量的类。在实例化对象时传递self参数不是一个选项,当你有一个很大的代码库时,这太耗时了。

我想到了一种查看调用堆栈帧的方法,并试图从那里获得实例化“我”的类。它应该是前一帧,但这种实现过于苛刻。

有什么想法吗?

1 个答案:

答案 0 :(得分:2)

这是一个非常hacky但有效的解决方案:

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参数。