实现深层继承链追踪应直接读取类的__mro__元组,它按c3线性化顺序包含从当前类到object的完整祖先类;封装函数需支持实例或类输入、缩进显示、可选深度限制及模块名隐藏。

要实现一个能追踪深层继承链的工具,关键不是遍历对象属性,而是解析类本身的 __mro__(Method Resolution Order)元组——它天然记录了从当前类到 object 的完整继承路径,包括所有中间基类和多重继承中的顺序。
直接读取 __mro__ 获取完整继承链
每个类都有一个 __mro__ 属性,是只读的元组,按解析顺序列出所有祖先类。这是最可靠、开销最小的方式。
-
cls.__mro__返回的是类对象自身的 MRO,不依赖实例 - 顺序严格遵循 C3 线性化算法,已处理多重继承冲突
- 首项是类本身,末项固定为
object
封装成可调用的追踪函数
写一个简洁函数,输入任意类或其实例,输出带缩进的层级结构:
- 若传入实例,先用
type(obj)提取其类 - 对
__mro__中每个类,用cls.__name__提取名称 - 用连字符或缩进体现深度,例如:
→ Animal → Mammal → Cat
处理多重继承与抽象基类
当类继承多个父类时,__mro__ 已自动合并路径;若涉及 abc.ABC 或注册的抽象基类,只要它们出现在 MRO 中,就会被自然包含。
- 无需额外判断是否为抽象类——只要在继承链里,
__mro__就会列出 - 避免手动递归
__bases__,容易遗漏或重复(尤其钻石继承) - 想排除内置类型?过滤掉
__name__.startswith('_')或检查cls.__module__ != 'builtins'
增强实用性:支持可选格式与限制深度
实际使用中常需控制输出粒度:
- 加参数
max_depth=3,只显示前 N 层(如只看直接父类和祖父类) - 加
show_module=False,默认隐藏模块名,避免冗长(如myapp.models.User→User) - 返回列表而非打印,便于进一步处理或日志记录











