在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
相关产品推荐
相关产品推荐

