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

重写继承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__方法。

解决方法

有两种可行的解决方式:

  1. 直接调用父类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)
    
  2. 保持参数签名与父类兼容
    调整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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.23 16:25:01