Python:实现不同类型的基类



我想知道是否有一种方法可以为不同类型实现基类的子类。每个子类都应该有单独的输入和输出类型,同时提供与基类相同的行为。

背景:我想处理电压和温度样本。100个电压样本形成一个电压数据集。100个温度样本组成一个温度数据集。多个电压数据集形成一个电压数据集群。温度也是如此。数据集的处理取决于它们的物理量。为了确保与电压相关的处理不能应用于温度样本,我想添加类型提示。

因此,如果有一种方法可以定义VoltageDataClustes方法append_dataset只允许VoltageDataset作为输入类型,我会很高兴。温度也是如此。

有没有一种方法可以在不复制的情况下实现这种行为;粘贴?

# base class
class DataCluster:
def __init__(self, name):
self.name = name
self.datasets = list()
def append_dataset(self, dataset: Dataset) -> None:
self.datasets.append(dataset)
# subclass that should allow VoltageDataset input only.
class VoltageDataCluster(DataCluster):
pass
# subclass that should allow TemperatureDataset input only.
class TemperatureDataCluster(DataCluster):
pass

谢谢!Niklas

您可以使用pydantic泛型模型。

from typing import Generic, TypeVar, List
from pydantic.generics import GenericModel
DataT = TypeVar('DataT')
class DataCluster(GenericModel, Generic[DataT]):
name: str
datasets: List[DataT] = []
def append_dataset(self, dataset: DataT) -> None:
self.datasets.append(dataset)
voltage_cluster = DataCluster[VoltageDataset](name="name")
voltage_cluster.append_dataset(some_voltage_dataset)

当您继承一个类时,它会自动继承该类的功能,因此不需要复制和粘贴。我将用一个例子来说明这一点。

# DataCluster.py
class DataCluster:
def __init__(self, name):
self.name = name
def printHello(self):
print("Hello")
# This will work in sub classes that have a "data" attribute
def printData(self):
print(self.data)

# VoltageDataCluster.py
from superclasses.DataCluster import DataCluster
class VoltageDataCluster(DataCluster):
def __init__(self, differentInput):
self.differentInput = differentInput
self.data = "someotherdata"

# mainclass.py
from superclasses.DataCluster import DataCluster
from superclasses.VoltageDataCluster import VoltageDataCluster
try:
dc = DataCluster("mark")
dc.printHello();
# The input for this class is not name
vdc = VoltageDataCluster("Some Other Input")
# These methods are only defined in DataCluster
vdc.printHello()
vdc.printData()

正如你所看到的,即使我们只定义了";printHello";方法,而另一个类在使用不同的输入时继承了该方法。因此不需要复制和粘贴。下面是一个可运行的示例(我添加了注释,告诉您在哪里可以找到每个使用的文件(。

编辑:添加了一个数据属性,使其与您的示例更加相关。

最新更新