如何将Python嵌套枚举的成员导出到包含它的类中?
解决嵌套枚举成员直接访问的方案
你可以用以下几种方式避免手动逐个赋值枚举成员,直接将嵌套枚举的成员提升为外层类的属性:
1. 批量遍历枚举成员注入
利用枚举类的__members__属性(存储所有枚举成员的字典),在类定义时循环注入:
import enum class Foo: class State(enum.Enum): Unloaded = enum.auto() Loaded = enum.auto() Processed = enum.auto() # 批量将State的成员赋值给Foo类 for name, member in State.__members__.items(): locals()[name] = member state: State
这样后续直接用Foo.Unloaded、foo.state = Foo.Loaded即可,新增枚举值时也无需修改注入代码。
2. 用元类实现通用逻辑
如果多个类都需要这种枚举成员提升的功能,写一个元类来统一处理,避免重复代码:
import enum class EnumPromoterMeta(type): def __new__(cls, name, bases, namespace): # 遍历类命名空间中的所有枚举类 for attr_name, attr in list(namespace.items()): if isinstance(attr, enum.EnumMeta): # 将枚举成员注入到外层类 for enum_name, enum_member in attr.__members__.items(): namespace[enum_name] = enum_member return super().__new__(cls, name, bases, namespace) class Foo(metaclass=EnumPromoterMeta): class State(enum.Enum): Unloaded = enum.auto() Loaded = enum.auto() Processed = enum.auto() state: State
后续其他类只要继承这个元类,嵌套的枚举成员会自动被提升到外层类中,扩展性更强。
3. 用内部导入简化代码
借助Python的类内相对导入语法,直接导入嵌套枚举的所有成员:
import enum class Foo: class State(enum.Enum): Unloaded = enum.auto() Loaded = enum.auto() Processed = enum.auto() # 从嵌套的State枚举导入所有成员 from __class__.State import * state: State
这种写法最简洁,但依赖Python的__class__相对导入语法,在一些老旧Python版本中可能不支持,适合使用较新版本Python的场景。
内容的提问来源于stack exchange,提问作者intelfx
相关产品推荐
相关产品推荐

