假设我有一个从类方法调用的自由函数.有没有办法让我在自由函数中反省调用堆栈并确定哪个对象叫我?
def foo(arg1) :
s = ? #Introspect call stack and determine what object called me
# Do something with s
谢谢!
最佳答案 实际上并没有“调用对象”的概念.你可以反省堆栈并找出你的调用函数是否有一个名为self的第一个参数,我想 – 如果你直接从一个正常编码的实例方法中调用(绝对不是你所说的
class method ……我想你呢’只是可怕的错误说法,因为类方法的目的是没有“一个对象”,即一个实例,涉及! – ),应该检测到.
inspect模块为您提供了高级内省的工具(建议仅用于调试和开发目的,绝不用于“实际生产使用”!!!).但是,请注意,即使跟踪函数也不是一件容易的事情:你得到的堆栈帧指向代码对象(它不指向函数).
仍然可以安排它,因为局部变量的伪序也是从堆栈帧指向的,而参数是局部变量,所以你要找的是你的调用者堆栈帧的局部变量中的一个条目自我(当然,你需要很多乐观和一点运气,因为没有人强迫你的来电者被明智地编码 – 通常名为self的论点可能会被另外命名,然后你就麻烦了;-).