我有以下情况:我有多个类在我的应用程序中到处实例化。我希望每个对象从父对象获取一个id(说我有对象B,对象B实例化对象C,然后对象B是对象C的父对象,但对象C也可以是其他对象的父对象,我不是在说话继承)。
我能保证的是,所有类都继承自同一个基类,让我们说rootobject类,我可以解决这个问题。
我真的想避免重构对象实例化,因为有大量的类。在实例化对象时传递self参数不是一个选项,当你有一个很大的代码库时,这太耗时了。
我想到了一种查看调用堆栈帧的方法,并试图从那里获得实例化“我”的类。它应该是前一帧,但这种实现过于苛刻。
有什么想法吗?
答案 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
参数。