You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何获取Python指定代码中类的调用顺序及相关类信息?

class A:
    def __init__(self, x, y):
        self.x = x
        self.y = y

    def __call__(self):
        return self.x + self.y

class B:
    def __init__(self, x, y):
        self.x = x
        self.y = y

    def __call__(self):
        return self.x - self.y


Class C:
    def __init__(self):
        pass

    def __call__(self):
        a = A(2, 3)
        b = B(a(), 3)
        return b
获取A、B类信息及调用顺序的方法

1. 获取A、B类的信息

  • 直接阅读源码:最直观,能直接看到类的构造参数、__call__方法的逻辑等核心信息。
  • 借助Python内置工具:
    • 用dir(A)或dir(B)可列出类的所有属性和方法;
    • 用inspect模块,比如inspect.getsource(A)能打印A类的完整源码,inspect.signature(A.__init__)可查看构造方法的参数要求;
    • 实例化类后查看属性,比如a = A(1,2),打印a.x和a.y就能确认实例属性的情况。

2. 确定A、B的调用顺序

  • 静态分析源码:在C.__call__方法中,创建B实例时传入了a()的结果作为参数,这意味着必须先执行a()(即A的__call__方法),才能完成B的实例化,所以调用顺序必然是A在前、B在后。
  • 动态调试验证:
    • 在A和B的__call__方法中添加打印语句,比如A的__call__里加print("A的__call__执行了"),B的加print("B的__call__执行了"),运行C()()就能看到明确的输出顺序;
    • 使用Python调试器pdb,在C.__call__的关键行设置断点,逐步跟踪执行流程,能清晰观察到调用顺序。
已知C类,确定其调用A、B及执行顺序的方法

1. 静态分析C类源码

直接查看C.__call__的实现:

  • 代码中明确创建了A的实例并调用其__call__方法,随后用该结果创建B的实例,由此可确定C调用了A和B;
  • 从代码执行逻辑来看,a()必须先计算出结果才能传给B的构造方法,因此执行顺序是A在前、B在后。

2. 动态验证

  • 给A、B的关键方法添加日志:比如在A的__init__加print("A类实例化"),__call__加print("执行A.__call__");B的__init__加print("B类实例化")。运行C()后,输出顺序为「A类实例化→执行A.__call__→B类实例化」,直接验证调用顺序。
  • 用cProfile分析:运行cProfile.run('C()()'),查看输出的调用统计结果,里面会显示A和B的调用先后顺序及次数。

内容的提问来源于stack exchange,提问作者user3243499

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.09 23:45:22