重写继承Enum的类的__new__方法触发TypeError问题排查
你遇到的TypeError: Enum.__new__() takes 2 positional arguments but 3 were given,本质是Enum的元类EnumMeta的特殊处理逻辑导致的:当子类MessageError中使用super().__new__时,并没有调用到父类Message的自定义__new__方法,反而直接调用了Enum的原始__new__方法。而Enum的__new__仅接受cls和value两个位置参数,你传入了三个参数(cls, 0, message),因此触发错误。
详细原因
当你在Message类中自定义__new__方法时,EnumMeta会将这个方法整合到枚举成员的创建流程中,但它会修改类的方法解析逻辑。当子类MessageError覆盖__new__并调用super().__new__时,由于EnumMeta的特殊处理,super()并不会指向Message的__new__,而是跳过父类的自定义方法,直接指向Enum的原始__new__方法。
解决方法
有两种可行的解决方式:
直接调用父类Message的__new__方法
修改MessageError的__new__方法,绕过super(),直接指定调用Message的__new__:class MessageError(Message): def __new__(cls, message: str): return Message.__new__(cls, 0, message) def __init__(self, message: str): super().__init__(0, message)保持参数签名与父类兼容
调整MessageError的__new__和__init__的参数签名,使其与Message的方法一致,同时固定verbose为0:class MessageError(Message): def __new__(cls, message: str, *args): return super().__new__(cls, 0, message, *args) def __init__(self, message: str, *args): super().__init__(0, message, *args)这种方式下,
Error类的成员定义无需修改,依然可以使用E_001 = 'This is an error',因为EnumMeta会自动将成员值作为参数传递给__new__。
内容的提问来源于stack exchange,提问作者Marko Gulin

