如何获取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__的关键行设置断点,逐步跟踪执行流程,能清晰观察到调用顺序。
- 在A和B的
已知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
相关产品推荐
相关产品推荐

