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

如何查询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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.26 10:54:34