繁体   English   中英

@abstractmethod 由要继承的第二个 class 给出(具有抽象方法的多个 inheritance)

[英]@abstractmethod given by a second class to inherit from (multiple inheritance with abstract methods)

我想定义一个抽象方法,从我的基础 class 到第二个 inheritance。

因为我可以想象我的问题甚至这句话令人困惑,这里是我正在尝试做的一个例子:

想象一下包含 2 个抽象方法的以下 BaseClass:过程和验证

class BaseClass(ABC):
"""
Base class for all services
"""

def __init__(self) -> None:
    pass

@abstractmethod
def validate_input(self, payload: dict) -> None:
    """
    validates the payload
    """
    pass

@abstractmethod
def process(self, payload: dict) -> dict:
    """
    processes the payload
    """
    pass

如您所知,BaseClass 中有 2 个方法需要由进程定义。 我现在想在继承自 BaseClass 的 Process1 class 中定义处理方法。 但是我还需要定义 validate_input 方法,对于不同的进程可以是相同的。 因此,我想使用多个 Inheritance 来解决这个问题。 在我的情况下,我想创建第二个 BaseValidation1 Class ,其中包含某种验证方法,例如检查有效负载中是否有密钥。

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: typing.Dict[str, typing.Any]) -> None:
    """
    check if dict contains a certain key
    """
    if not payload_dict:
        raise ValidationException("payload is empty")
    if not payload_dict.get("key"):
        raise ValidationException("payload does not contain key")

所以现在我想从两者继承来定义我的 Process1。

class Process1(BaseClass,Validation1):
"""
Base class for processing the payload
"""
def process(self, payload: typing.Dict) -> typing.Dict:
    """
    Process the payload
    """
    processed_payload = payload
    return processed_payload
    
  

然而,我非常不确定我的方法是否是解决这个问题的最佳方法。 此外,Pylint 已经显示以下警告:

E0110: Abstract class 'Process1' with abstract methods instantiated (abstract-class-instantiated)

感谢任何解决方案。

如果您颠倒基类的顺序,则您的示例有效:

class Process1(Validation1, BaseClass):
    ...

原因与python的方法解析顺序有关:您定义Process1的父类的方式导致 python 解释器在您调用Process1.validate() BaseClass.validate() ) ,这是抽象的。

我会进一步从Validation1中删除 ABC 父级,因为我认为 class 是Mixin 这是一个完全可用的最小示例:

from abc import ABC, abstractmethod


class BaseClass(ABC):

    def __init__(self):
        pass

    @abstractmethod
    def validate(self):
        pass

    @abstractmethod
    def process(self):
        pass


class ValidationMixin:

    def validate(self):
        pass


class Processor(ValidationMixin, BaseClass):

    def process(self):
        pass

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM