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

在Python调用类中获取调用者类实例后无法访问实例变量的问题排查与解决

我来帮你分析下问题出在哪以及怎么解决:

问题根源

先看报错信息:AttributeError: type object 'CallerClass' has no attribute 'value',这说明你调用test_f时,传入的self是CallerClass类本身,而不是它的实例对象。

看你代码里的这行:

caller = prev_frame.f_locals['self'].__class__

这里的__class__会返回当前实例所属的类,所以caller变量存储的是CallerClass这个类,而不是那个包含self.value=100的具体实例。

之后你调用caller.test_f(caller),相当于把类作为参数传给了test_f的self参数。而value是实例属性——只有类创建出来的实例才会有,类本身是没有这个属性的,所以自然会报错。

解决方法

你需要直接获取CallerClass的实例对象,而不是类。只需要去掉.__class__,然后直接用实例调用test_f方法(实例方法调用时,Python会自动把实例绑定为self,不需要手动传参)。

修改后的完整代码:

import inspect
class CallingClass():
    def __init__(self):
        prev_frame = inspect.currentframe().f_back
        # 直接拿到CallerClass的实例,而非类
        caller_instance = prev_frame.f_locals['self']
        print(f"The caller is {caller_instance.__class__.__name__}")
        # 用实例调用方法,self会自动绑定为该实例,无需手动传参
        caller_instance.test_f()

class CallerClass():
    def __init__(self):
        self.value = 100
        i = CallingClass()
    def test_f(self):
        print("This line is fine.")
        print(f"The value is {self.value} and it works now!")

if __name__ == "__main__":
    t = CallerClass()
运行结果

修改后运行会输出:

The caller is CallerClass
This line is fine.
The value is 100 and it works now!
补充说明
  • prev_frame.f_locals['self']拿到的是CallerClass在__init__里创建的那个实例(也就是主函数里的t),这个实例拥有self.value属性。
  • 实例方法(比如test_f)通过实例调用时,Python会自动把该实例作为第一个参数(也就是self)传入,完全不需要手动传参。如果强行传类,就会把类当成self,导致访问实例属性失败。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.27 20:37:44