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

时间:2010-07-13 15:24:16

标签: python introspection

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

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

谢谢!

1 个答案:

答案 0 :(得分:2)

实际上没有“调用对象”的概念。您可以反省堆栈并查找您的调用函数是否有第一个名为self的参数,我想 - 如果您直接从正常编码的实例调用方法(绝对一个class method正如你所说的......我想你只是可怕的错误说话,因为一个{的目的 {1}} 有“一个对象”,即一个涉及的实例! - ),它应该检测到它。

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

仍然,可以进行排列,因为还有来自堆栈帧的局部变量的伪序,参数是局部变量,所以你要找的是一个条目调用者的堆栈帧的局部变量,名为classmethod(此外,您当然需要很多乐观和一点运气,因为没有人强制您的调用者被明智地编码 - 通常名为self 的参数可以以其他方式命名,然后您遇到麻烦; - )。