我有以下形状的 Python 代码:
from dataclasses import dataclass
@dataclass
class Foo_Data:
foo: int
class Foo_Processor:
def process(self, data: Foo_Data): ...
class Foo_Loader:
def load(self, file_path: str) -> Foo_Data: ...
@dataclass
class Bar_Data:
bar: str
class Bar_Processor:
def process(self, data: Bar_Data): ...
class Bar_Loader:
def load(self, file_path: str) -> Bar_Data: ...
我有多个此类数据/处理器/加载器设置的实例,并且这些类都具有相同的方法签名,以特定类系列(Foo、Bar 等)为模数。如果我决定创建一个 、Spam_Data
和Spam_Processor
类Spam_Loader
系列,是否有一种 Python 式的方式来形式化类之间的这种关系以强制执行类似的结构?例如,我想要强制执行Spam_Processor
某种process
方法,该方法采用 类型的参数Spam_Data
。是否有办法通过抽象类、泛型类型或其他结构来实现这种标准化?
我尝试使用抽象类,但mypy正确地指出,让所有 *_Data 类成为抽象Data
类的子类,并且同样让所有 *_Processor 类成为抽象Processor
类的子类,这违反了里氏替换原则,因为每个处理器仅针对其各自的数据类设计(即,Foo_Processor
无法处理,但人们会期望如果这些类具有超类并且以这种方式兼容,Bar_Data
它可以处理)。Processor
Data
您可以将抽象基类 (ABC) 与泛型结合使用。这样,您可以定义一个通用接口,同时确保类型安全:
现在您可以定义您的特定课程
以这种方式编写代码将通用接口和类型安全的优点结合在一起。
ABC 确保子类实现所需的方法,从而促进一致的结构。
泛型允许特定类型的操作,增强代码的可读性和可维护性。
使用 mypy 进行确认: