如何在带条件的多继承中避免使用Dummy类
重构方案:移除Dummy类的动态多继承实现
原代码里的Dummy类只是用来在条件不满足时占位,完全可以通过动态构建父类列表的方式彻底移除它们,同时保持原有继承逻辑和方法解析顺序(MRO)不变:
from configuration.global_vars import IS_JENKINS_JOB, IS_TEST, IS_DOCKER, IS_TLF from .base_runner import BaseRunner from .base_runner_DOCKER import BaseRunnerDOCKER from .base_runner_JENKINS import BaseRunnerJENKINS from .base_runner_PROD import BaseRunnerPROD from .base_runner_TEST import BaseRunnerTEST from .base_runner_TLF import BaseRunnerTLF # 动态构建父类列表,只包含满足条件的类 parent_classes = [] if IS_JENKINS_JOB: parent_classes.append(BaseRunnerJENKINS) if IS_DOCKER: parent_classes.append(BaseRunnerDOCKER) if IS_TLF: parent_classes.append(BaseRunnerTLF) # 添加TEST/PROD分支的父类,与原逻辑一致 parent_classes.append(BaseRunnerTEST if IS_TEST else BaseRunnerPROD) # 最后添加基础父类BaseRunner parent_classes.append(BaseRunner) # 用动态生成的父类列表定义CombinedBase class CombinedBase(*parent_classes): pass
方案说明
- 逻辑等价:原代码中的Dummy类是空类,不影响继承行为;重构后直接跳过不满足条件的类,父类列表仅包含需要的实现类,MRO顺序和原代码完全匹配(满足条件的类按JENKINS→DOCKER→TLF的顺序,接着是TEST/PROD分支,最后是BaseRunner)。
- 代码精简:移除了冗余的Dummy类定义,条件判断更直观,后续维护时能快速识别哪些类会被继承。
- 扩展性强:如果后续新增环境分支,只需在
parent_classes中添加对应的条件判断即可,无需再创建新的Dummy类。
可选进阶实现
如果需要在运行时动态调整类属性,也可以用type()函数直接创建类:
CombinedBase = type( "CombinedBase", tuple(parent_classes), {} # 可在这里添加类属性/方法 )
效果和直接定义类完全一致,适合更灵活的动态类构建场景。
内容的提问来源于stack exchange,提问作者maxbah
相关产品推荐
相关产品推荐

