如何查询Python模块的结构化内容大纲?含类、属性、方法等信息
如何获取Python模块的结构化内容与成员信息?
嘿,我来给你捋捋这两个问题的解决方案——毕竟用__dict__和dir()确实容易看得眼花缭乱,尤其是模块结构复杂的时候。
一、快速区分模块内的属性、方法及其所属类
如果你不想自己手动筛选,Python的inspect模块绝对是救星,它能帮你精准区分类、方法、属性这些不同类型的成员。举个实际的例子,比如分析datetime模块:
import inspect import datetime # 遍历模块内所有成员,按类型分类输出 for name, member in inspect.getmembers(datetime): if inspect.isclass(member): print(f"🔍 类: {name}") # 深入类内部,提取方法和属性 for attr_name, attr_member in inspect.getmembers(member): if inspect.isfunction(attr_member) or inspect.ismethod(attr_member): # 过滤掉魔法方法(可选,看你需求) if not attr_name.startswith("__"): print(f" 🛠️ 方法: {attr_name}") elif not attr_name.startswith("__"): print(f" 📦 属性: {attr_name}") elif inspect.isfunction(member) and not name.startswith("__"): print(f"⚡ 模块级函数: {name}") elif not name.startswith("__"): print(f"📌 模块级属性: {name}")
这个代码会把类、类的方法/属性、模块级函数/属性清晰分开,不会像dir()那样把所有东西混在一起。
二、生成模块的结构化大纲(含继承关系)
如果要生成蓝图式的目录,光靠inspect手动写代码可以实现,用第三方工具则能一键搞定,两种方式我都给你说说:
1. 用inspect手动构建结构化大纲
写个简单的函数,就能把模块的完整结构(包括类的继承链、成员)输出成清晰的格式:
import inspect def build_module_outline(module): print(f"📋 模块结构大纲: {module.__name__}\n") # 先处理模块级内容 module_funcs = [name for name, func in inspect.getmembers(module, inspect.isfunction) if not name.startswith("__")] module_attrs = [name for name, attr in inspect.getmembers(module) if not inspect.isclass(attr) and not inspect.isfunction(attr) and not name.startswith("__")] print(f"模块级函数: {', '.join(module_funcs) if module_funcs else '无'}") print(f"模块级属性: {', '.join(module_attrs) if module_attrs else '无'}\n") # 处理类结构(含继承) for cls_name, cls in inspect.getmembers(module, inspect.isclass): # 获取继承的父类(排除默认的object) parent_classes = [base.__name__ for base in cls.__bases__ if base.__name__ != 'object'] parent_str = f"(继承自: {', '.join(parent_classes)})" if parent_classes else "" print(f"🔹 类: {cls_name} {parent_str}") # 提取类的方法和属性 cls_methods = [name for name, meth in inspect.getmembers(cls) if (inspect.isfunction(meth) or inspect.ismethod(meth)) and not name.startswith("__")] cls_attrs = [name for name, attr in inspect.getmembers(cls) if not name.startswith("__") and not inspect.isclass(attr) and not inspect.isfunction(attr)] print(f" 方法: {', '.join(cls_methods) if cls_methods else '无'}") print(f" 属性: {', '.join(cls_attrs) if cls_attrs else '无'}\n") # 调用示例:分析datetime模块 import datetime build_module_outline(datetime)
运行后会输出层级分明的大纲,连每个类的继承关系都标得清清楚楚。
2. 第三方工具一键生成(更省心)
如果你不想写代码,这些工具能帮你直接生成结构化输出:
- pdoc: 在终端直接运行
pdoc 你的模块名.py,会输出格式化的模块结构,包括类继承、成员说明,还能生成HTML文档,终端输出已经足够直观。 - pyinspect: 安装后用
pyinspect.inspect(你的模块),会以更美观的交互式格式展示模块结构,甚至能帮你过滤掉无关信息。 - IPython内置功能: 如果你用IPython,直接输入
你的模块?或者你的类?,就能快速查看带结构的文档和成员列表,非常适合临时查询。
小技巧补充
- 过滤魔法成员:大部分时候,以
__开头的魔法方法/属性不是我们关注的重点,所以在代码里加上not name.startswith("__")可以让输出更干净。 - 查看完整继承链:如果想深入类的继承关系,用
cls.mro()可以获取完整的方法解析顺序,比如datetime.datetime.mro()会返回它的所有父类层级。
内容的提问来源于stack exchange,提问作者avimehenwal
相关产品推荐
相关产品推荐

