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
相关产品推荐
相关产品推荐

