python introspection – 如何检测我所在的对象

假设我有一个从类方法调用的自由函数.有没有办法让我在自由函数中反省调用堆栈并确定哪个对象叫我?

def foo(arg1) :
  s = ? #Introspect call stack and determine what object called me
  # Do something with s

谢谢!

最佳答案 实际上并没有“调用对象”的概念.你可以反省堆栈并找出你的调用函数是否有一个名为self的第一个参数,我想 – 如果你直接从一个正常编码的实例方法中调用(绝对不是你所说的
class method ……我想你呢’只是可怕的错误说法,因为类方法的目的是没有“一个对象”,即一个实例,涉及! – ),应该检测到.

inspect模块为您提供了高级内省的工具(建议仅用于调试和开发目的,绝不用于“实际生产使用”!!!).但是,请注意,即使跟踪函数也不是一件容易的事情:你得到的堆栈帧指向代码对象(它不指向函数).

仍然可以安排它,因为局部变量的伪序也是从堆栈帧指向的,而参数是局部变量,所以你要找的是你的调用者堆栈帧的局部变量中的一个条目自我(当然,你需要很多乐观和一点运气,因为没有人强迫你的来电者被明智地编码 – 通常名为self的论点可能会被另外命名,然后你就麻烦了;-).

点赞