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