Python中有没有比dir()更好的对象属性类型查询工具?
增强版对象属性分类查询解决方案
原生实现方案
不需要依赖第三方包,搭配Python标准库inspect模块就可以对dir()返回的属性名做分类标注:
- 先遍历
dir()返回的所有属性名,用getattr(目标对象, 属性名)拿到对应的属性实体 - 用以下方法做类型区分:
- 调用
inspect.ismethod(属性)或inspect.isfunction(属性)判断是否为方法 - 调用
callable(属性)为False的判定为普通变量属性 - 对比属性名是否存在于
目标对象.__dict__中,不存在即可判定为继承来的属性 - 调用
inspect.isdatadescriptor(属性)可判定是否为property类描述符属性
- 调用
示例代码片段:
import inspect def enhanced_dir(obj): res = {"方法": [], "普通变量": [], "继承属性": []} self_attrs = set(obj.__dict__.keys()) for attr_name in dir(obj): # 过滤魔法方法可自行调整判断逻辑 if attr_name.startswith("__") and attr_name.endswith("__"): continue attr = getattr(obj, attr_name) if attr_name not in self_attrs: res["继承属性"].append(attr_name) elif inspect.ismethod(attr) or inspect.isfunction(attr): res["方法"].append(attr_name) else: res["普通变量"].append(attr_name) return res
第三方工具方案
如果不想自己写封装,可以直接用现成的第三方包:
dir2:专门针对原生dir做增强的轻量工具,直接返回带分类标注的字典,默认自动区分实例方法、类方法、静态方法、实例变量、类变量、继承属性等多个类别,调用方式和原生dir一致,传入目标对象即可inspect-utils:封装了更丰富的内省工具,除了基础分类外,还可以标注属性的访问权限、是否为魔法方法、继承自哪个父类等额外信息rich-inspect:如果需要可视化输出分类结果,可以用这个包实现带颜色高亮的分类属性打印,调试时可读性更高
内容的提问来源于stack exchange,提问作者Burnt Umber
相关产品推荐
相关产品推荐

