获取对调用函数的类实例的引用

2024-04-27 04:23:36 发布

您现在位置:Python中文网/ 问答频道 /正文

我试图跟踪给定函数的函数调用层次结构(traceback),但这种方式允许我获取对一个类的引用,该类将函数作为属性。获取类实例的引用也很好。你知道吗

如果我有一个类A的对象,它有函数do_work,函数do_work调用一个函数f,我想知道在f内部A的哪个实例调用了它。你知道吗

目前,使用inspect模块可以获得正确的函数调用顺序,但这不包括对将函数作为属性保存的类或对象实例的任何引用:

import inspect


class A:
    def __init__(self, name):
        self.name = name

    def do_work(self):
        return f()


def f():
    return inspect.stack()


a = A("test")
print(a.do_work())
[
FrameInfo(frame=<... line 13, code f>, code_context=['return inspect.stack()'])
FrameInfo(frame=<..., line 9, code do_work>, code_context=['return f()']),
FrameInfo(frame=<..., line 17, code <module>>, code_context=['print(a.do_work())'])
]

我想从f获取对a对象实例或至少对A类的引用。你知道吗


Tags: 对象实例函数nameselfreturndefcontext
1条回答
网友
1楼 · 发布于 2024-04-27 04:23:36

给定您感兴趣的帧的帧信息:

frame_info = inspect.stack()[1]
# FrameInfo(frame=<frame at 0x107b959d8, file ..., line 8, code do_work>, filename='...', lineno=8, function='do_work', code_context=['        return f()\\n'], index=0)

您可以通过以下方式访问a对象(在该帧中称为self):

frame_info.frame.f_locals['self']
# <__main__.A object at 0x107b86a20>

对于其类名using

frame_info.frame.f_locals['self'].__class__.__name__
# A

相关问题 更多 >