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

如何在基类方法中访问所有派生类的指定类属性?

继承链中收集类属性的实现方案

完整代码示例

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}

实现思路

  1. 利用__mro__遍历继承链:Python类自带__mro__属性,它以元组形式返回类的方法解析顺序,顺序从当前类(比如E)开始,依次向上包含所有父类(D、C,直到顶层object)。
  2. 收集并合并keys属性:遍历__mro__时,将每个类的keys集合合并到总集合中,当遍历到基类C时停止,避免额外遍历无关的顶层类。
  3. 无侵入式实现:所有逻辑封装在基类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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.11 11:36:00