如何查找Python类中指定属性所属的父类?
解决方法
先解释你看到的代码逻辑:删除self.userinfo后立刻访问是合理的——这个属性大概率是父类中用@property装饰的动态属性。删除实例上的该属性后,再次访问会触发父类定义的getter方法,重新加载数据,这就是注释里force reload的含义。
下面是几种快速定位userinfo所属父类的方法:
遍历父类检查属性
直接加一段调试代码,遍历APISite的所有父类,排查哪个类定义了userinfo(包括普通属性或@property方法):import inspect from your_module import APISite # 替换为实际模块名 for base_class in APISite.__bases__: if hasattr(base_class, 'userinfo'): attr = getattr(base_class, 'userinfo') if isinstance(attr, property): print(f"userinfo 是 {base_class.__name__} 中的@property属性") else: print(f"userinfo 定义在 {base_class.__name__} 中")调试时利用MRO查找
在访问self.userinfo的行打个断点,运行到断点后在调试控制台执行:attr_name = 'userinfo' for cls in type(self).__mro__: if attr_name in cls.__dict__: print(f"{attr_name} 来自父类: {cls.__name__}") breakPython的方法解析顺序(MRO)会从当前类往上逐层查找,第一个包含该属性的类就是它的定义处。
用inspect模块定位源码位置
如果想直接跳转到源码,执行这段代码(需在访问self.userinfo的上下文里运行):import inspect prop = getattr(type(self), 'userinfo') print(f"源码文件路径: {inspect.getsourcefile(prop.fget)}") print(f"源码起始行号: {inspect.getsourcelines(prop.fget)[1]}")
内容的提问来源于stack exchange,提问作者Roy Smith
相关产品推荐
相关产品推荐

