Python多继承实现抽象方法复用及Pylint E0110报错解决咨询
报错原因
- 首先是方法签名不匹配:
BaseClass中定义的validate_input参数为payload: dict,但Validation1中实现的同名方法参数为payload_dict: typing.Dict[str, typing.Any],参数名不匹配会被Python识别为不同的方法,因此Pylint判定Process1没有实现抽象方法validate_input,将其判定为抽象类,实例化时就会抛出E0110错误。 - 其次是继承顺序影响MRO解析:你当前
Process1的继承顺序是(BaseClass, Validation1),基类的抽象方法优先级高于右侧父类的实现,也可能导致抽象方法判定异常。
解决方案
1. 修正方法签名保证一致
把Validation1中的validate_input参数名调整为和BaseClass定义完全一致:
import typing from abc import ABC, abstractmethod # 提前自定义你的ValidationException class ValidationException(Exception): pass class Validation1(ABC): """ Validates if the payload is valid given a certained method e.g. if payload contains a certain key """ def validate_input(self, payload: dict) -> None: """ check if dict contains a certain key """ if not payload: raise ValidationException("payload is empty") if not payload.get("key"): raise ValidationException("payload does not contain key")
2. 调整继承顺序
把实现了抽象方法的类放在继承列表的左侧,优先匹配实现逻辑:
class Process1(Validation1, BaseClass): """ Base class for processing the payload """ def process(self, payload: typing.Dict) -> typing.Dict: """ Process the payload """ processed_payload = payload return processed_payload
修改完成后实例化Process1就不会再触发E0110警告了。
方案合理性说明
你这种通过Mixin类抽离通用逻辑的多继承方案是Python中非常常规的实现方式,符合开闭原则,没有明显问题。后续新增不同的验证逻辑只需要新增对应的Validation类,不同的处理类可以自由组合复用验证逻辑,不需要重复编写验证代码。
如果要进一步优化,可以把Validation1改成不需要继承ABC的普通Mixin类,因为它本身没有抽象方法需要实现:
# 优化后的Validation1,不需要继承ABC class Validation1Mixin: """ Validates if the payload is valid given a certained method e.g. if payload contains a certain key """ def validate_input(self, payload: dict) -> None: """ check if dict contains a certain key """ if not payload: raise ValidationException("payload is empty") if not payload.get("key"): raise ValidationException("payload does not contain key")
内容的提问来源于stack exchange,提问作者YannickAaron
相关产品推荐
相关产品推荐

