如何在基类方法中访问所有派生类的指定类属性?
继承链中收集类属性的实现方案
完整代码示例
class C: keys = {1} def get_keys(self): all_keys = set() # 遍历当前类到基类C的继承链 for cls in self.__class__.__mro__: all_keys.update(cls.keys) # 遍历到基类C时停止 if cls is C: break return all_keys class D(C): keys = {2,3} class E(D): keys = {4,5} # 测试 print(E().get_keys()) # 输出 {1,2,3,4,5}
实现思路
- 利用
__mro__遍历继承链:Python类自带__mro__属性,它以元组形式返回类的方法解析顺序,顺序从当前类(比如E)开始,依次向上包含所有父类(D、C,直到顶层object)。 - 收集并合并
keys属性:遍历__mro__时,将每个类的keys集合合并到总集合中,当遍历到基类C时停止,避免额外遍历无关的顶层类。 - 无侵入式实现:所有逻辑封装在基类
C的get_keys方法中,派生类D、E无需添加任何额外代码,完全符合需求。
简化写法(可选)
如果想让代码更简洁,可以用生成器表达式直接生成合并后的集合:
class C: keys = {1} def get_keys(self): return { key for cls in self.__class__.__mro__ for key in cls.keys if cls is not object } # 测试结果一致 print(E().get_keys()) # 输出 {1,2,3,4,5}
这种写法依赖__mro__的顺序,同时排除了object类(它没有keys属性),同样能达到目标。
内容的提问来源于stack exchange,提问作者ardabro
相关产品推荐
相关产品推荐

