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

Python如何重写已覆盖超类方法的子类方法,解决super()调用报错

多层继承下方法重写及super调用报错解决方案

核心错误点

  • 继承定义笔误:原代码中class SubClass2(SubClass2):属于错误的自继承,正确应当继承SubClass1
  • 方法类型不匹配:父类链的function都是实例方法,SubClass2错误添加@classmethod装饰器将其改为类方法,二者调用逻辑完全不兼容
  • 类方法参数错误:@classmethod装饰的方法第一个参数约定为cls(指代当前类对象),你用self接收的实际是类而非实例,导致super()默认绑定实例的逻辑失效,触发类型错误
  • overrides装饰器校验不全:当前仅校验方法名存在,未校验方法签名/类型是否匹配,无法提前捕获方法类型改写的错误

修复方案

方案1:移除多余的@classmethod装饰器(最推荐,符合你和SubClass1实现高度相似的需求)

你提到SubClass2的实现仅和SubClass1差一行、参数完全一致,说明不需要把方法改为类方法,删掉该装饰器即可:

from typing import List

# 原有的overrides装饰器
def overrides(interface_class):
    """Marks method as override of parent class' method"""
    def overrider(method):
        assert (method.__name__ in dir(interface_class))
        return method
    return overrider

class SuperClass:
    def function(self, args: List[str] = None):
        # some code
        pass

class SubClass1(SuperClass):
    @overrides(SuperClass)
    def function(self, args: List[str] = None):
        # some code
        super().function(args)

# 修正继承关系为继承SubClass1
class SubClass2(SubClass1):
    @overrides(SubClass1)
    def function(self, args: List[str] = None):
        # 独有逻辑(和SubClass1相差的那一行代码)
        super().function(args)

该方案完全符合方法重写规则,super调用不会出现任何报错。

方案2:如果确实需要SubClass2的function是类方法

需要将整条继承链的function都改为类方法,保证方法类型一致:

from typing import List

def overrides(interface_class):
    """Marks method as override of parent class' method"""
    def overrider(method):
        assert (method.__name__ in dir(interface_class))
        return method
    return overrider

class SuperClass:
    @classmethod
    def function(cls, args: List[str] = None):
        # some code
        pass

class SubClass1(SuperClass):
    @classmethod
    @overrides(SuperClass)
    def function(cls, args: List[str] = None):
        # some code
        super().function(args)

class SubClass2(SubClass1):
    @classmethod
    @overrides(SubClass1)
    def function(cls, args: List[str] = None):
        # 独有逻辑
        super().function(args)

类方法中super()会自动绑定cls参数,方法类型一致后调用不会报错。

额外优化建议

可以给overrides装饰器增加签名校验逻辑,提前捕获这类方法类型、参数不匹配的错误,避免运行时才发现问题。

内容的提问来源于stack exchange,提问作者Alexander Pakhomovskii

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.28 21:27:05