Python3.8中枚举类继承无法生效?求问题根源
枚举类继承在Python3.7与3.8的行为差异原因
问题现象
以下代码在Python3.7中运行正常:
from enum import Enum class UserRoles(Enum): ADMIN = 'ADMIN' MANAGER = 'MANAGER' MEMBER = "MEMBER" class AuthorRoles(UserRoles, Enum): pass
但在Python3.8中执行会抛出如下错误:
Traceback (most recent call last): File "<stdin>", line 1, in <module> File "/usr/lib/python3.8/enum.py", line 146, in __prepare__ metacls._check_for_existing_members(cls, bases) File "/usr/lib/python3.8/enum.py", line 527, in _check_for_existing_members raise TypeError( TypeError: AuthorRoles: cannot extend enumeration 'UserRoles'
原因分析
- Python3.7及更早版本的Enum元类未严格限制继承已包含枚举成员的类,默许了这种不规范的继承操作。
- Python3.8开始,
EnumMeta元类新增了_check_for_existing_members检查方法:遍历父类时,若发现父类是已定义枚举成员的Enum类,直接抛出TypeError禁止继承。 - 你的代码中
UserRoles已明确定义三个枚举成员,因此在3.8中继承它的AuthorRoles会触发该检查逻辑,导致报错。 - 官方文档一直不推荐继承已有成员的枚举类,3.8的改动只是将这种不规范用法从“默许”转为“明确禁止”,以此规避继承枚举类可能引发的成员冲突、行为不一致等潜在问题。
内容的提问来源于stack exchange,提问作者DilLip_Chowdary
相关产品推荐
相关产品推荐

