真正可用的属性需过滤双下划线和单下划线项,优先检查公共接口;内置类型不支持动态属性,自定义类才可在__dict__中体现;结合type()、关键词筛选与help()或__doc__定位关键方法。

dir() 返回的属性里哪些是真正可用的?
dir() 会列出对象所有属性和方法名,包括以 __ 开头的“特殊方法”、继承来的、甚至模块导入时带进来的杂项。它不区分“属于这个对象”还是“只是能访问”,也不告诉你哪些能调用、哪些是只读、哪些需要参数。
实际排查建议:
- 先过滤掉明显无用的:
[x for x in dir(obj) if not x.startswith('_')]—— 剔除双下划线方法(如__str__)和单下划线私有约定(如_cache),聚焦公共接口 - 注意
dir()不保证顺序,别依赖输出位置判断重要性 - 对类实例调用
dir(),结果可能包含父类属性;但对类本身调用,有时会漏掉实例属性(因为没实例化),这时得看obj.__dict__.keys()
help() 显示内容太长或报错怎么办?
help() 默认启动交互式帮助系统,终端卡住、翻页困难、甚至对某些动态生成的对象直接抛 TypeError: <...> is not a module, class, method, function, traceback, frame, or builtin</...>。
更稳妥的用法:
- 用
help(obj.method)替代help(obj)—— 方法粒度更准,避免文档爆炸 - 在 Jupyter 或 IPython 中,优先用
obj.method?(问号)或obj.method??(双问号),比help()更快、支持高亮、还能看到源码(如果可读) - 遇到
help()报错,先确认对象是否为内置类型(如int、list)或用户定义类;若为第三方库对象(如requests.Response),可能文档未嵌入,此时查官网或obj.__doc__更可靠
为什么 dir() 看不到我刚加的属性?
常见于动态赋值后立即调用 dir() 却找不到新属性,比如:
Python 3.14.2是Python编程语言在2025年12月5日发布的稳定版本,属于3.14系列的第二个维护更新。该版本包含了18项修复,重点解决了多进程、数据类及正则表达式等模块的回归问题,并修复了CVE-2025-12084等安全漏洞。此版本标志着自由线程模式(移除GIL)正式获得官方支持,是Python发展的重要里程碑。
obj = [] obj.my_attr = "test" dir(obj) # 通常不包含 'my_attr'
这是因为 dir() 主要反映对象的类定义 + __dict__ 中的键,但对内置类型(如 list、dict)禁用动态属性写入——实际赋值失败或被忽略,而 Python 不报错。
验证方式:
- 检查
obj.__dict__:若为空或根本不存在(如list没__dict__),说明该类型不支持动态属性 - 换成自定义类:
class A: pass; a = A(); a.x = 1; dir(a)就能看到'x' - 想绕过限制?用
types.SimpleNamespace或argparse.Namespace,它们专为动态属性设计
如何组合 dir() 和 help() 定位关键方法?
典型探索流程不是“先 dir 再 help 每一个”,而是有策略地缩小范围:
- 先用
type(obj)确认类型,再查该类型的常用方法名(比如str对象常找split、strip;datetime找strftime、replace) - 用
dir(obj)输出重定向到变量:attrs = dir(obj); [a for a in attrs if 'format' in a.lower()]快速筛选关键词 - 对候选方法执行
help(getattr(obj, 'method_name')),避免手动输错名;注意有些方法是 property,help()会显示property类型而非函数签名 - 别忘了
obj.__doc__—— 很多简洁说明就在这里,比help()更轻量
最易被忽略的一点:dir() 和 help() 都不处理属性描述符(比如通过 @property 定义的)、也不展开 __getattr__ 动态逻辑。真遇到“明明文档写了却 dir() 不见”的情况,十有八九是这类机制在起作用。
Python免费学习笔记(深入):立即使用
在学习笔记中,你将探索 Python 的核心概念和高级技巧!










