@abstractmethod 由第二个 class 给出继承自(多重继承与抽象方法)
@abstractmethod given by a second class to inherit from (multiple inheritance with abstract methods)
我想定义一个抽象方法,它从我的基础 class 通过第二次继承。
因为我可以想象我的问题甚至这句话令人困惑这里是我正在尝试做的一个例子:
假设以下 BaseClass 包含 2 个抽象方法:处理和验证
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 方法,对于不同的进程可以是相同的。因此我想到了使用多重继承来解决这个问题。
在我的例子中,我想创建第二个 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)
感谢任何解决方案。
你的例子有效,如果你颠倒你的基地的顺序 classes:
class Process1(Validation1, BaseClass):
...
原因与 python's method resolution order 有关:您定义 Process1
的父 class 的方式导致 python 解释器“查找”BaseClass.validate()
当你调用 Process1.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
我想定义一个抽象方法,它从我的基础 class 通过第二次继承。
因为我可以想象我的问题甚至这句话令人困惑这里是我正在尝试做的一个例子:
假设以下 BaseClass 包含 2 个抽象方法:处理和验证
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 方法,对于不同的进程可以是相同的。因此我想到了使用多重继承来解决这个问题。 在我的例子中,我想创建第二个 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)
感谢任何解决方案。
你的例子有效,如果你颠倒你的基地的顺序 classes:
class Process1(Validation1, BaseClass):
...
原因与 python's method resolution order 有关:您定义 Process1
的父 class 的方式导致 python 解释器“查找”BaseClass.validate()
当你调用 Process1.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