想象一下我在python中有以下内容(实际语言并不重要,因为我在php等其他语言中也有这个问题.基类"CarModel"和来自"CarModel"的派生类"TruckModel".

class CarModel:
    def __init__(self):
        self.__wheel_count: int = 0

    def set_wheel_count(self, value: int) -> None:
        self.__wheel_count = value

class TruckModel(CarModel):
    def __init__(self):
        super().__init__()
        self.__load_in_kg: int = 0

    def set_load_in_kg(self, value: int) -> None:
        self.__load_in_kg= value

如果我现在有一个映射类,它应该将例如一个dict转换成我的Model,我如何为我的派生类重用映射方法? 尤其是如果我的基类有很多setter方法,我必须重复代码,这是我不喜欢的("ry").

class VehicleMapper:
    def map_car_dict_to_car_model(dict: Dict) -> CarModel:
        model: CarModel = CarModel()
        model.set_wheel_count(dict['wheelCount'])
        return model

    def map_truck_dict_to_truck_model(dict: Dict) -> TruckModel:
        model: TruckModel= TruckModel()
        model.set_load_in_kg(dict['loadInKg'])
 
        model.set_wheel_count(dict['wheelCount']) #  ??? How can I re-use the map-method for the base class here ???
        
        return model

我可以把映射方法移到模型类中,这样就可以了.但是我被教导,模型类应该只"保存"数据,而不应该做任何事情.这就是为什么有映射器类,对吧?

推荐答案

更干净和solid的方法是使用单独的映射器/工厂.
而且它甚至更合理,因为在您的例子中,您还需要一个从Dict键到各自模型属性名称的可配置映射.

请考虑以下模式:

class CarModel:
    def __init__(self):
        self.__wheel_count: int = 0

    def wheel_count(self, value: int) -> None:
        self.__wheel_count = value

    wheel_count = property(None, wheel_count)

class TruckModel(CarModel):
    def __init__(self):
        super().__init__()
        self.__load_in_kg: int = 0

    def load_in_kg(self, value: int) -> None:
        self.__load_in_kg= value

    load_in_kg = property(None, load_in_kg)


class VehicleFactory:
    """Vehicle base factory"""
    __model__ = None
    __map_keys__ = None

    @classmethod
    def create(cls, data):
        model = cls.__model__()
        for k, attr in cls.__map_keys__.items():
            setattr(model, attr, data[k])
        return model

class CarFactory(VehicleFactory):
    __model__ = CarModel
    __map_keys__ = {'wheelCount': 'wheel_count'}

class TruckFactory(VehicleFactory):
    __model__ = TruckModel
    __map_keys__ = {'wheelCount': 'wheel_count',
                    'loadInKg': 'load_in_kg'}

用途:

car = CarFactory.create({'wheelCount': 4})
print(vars(car))    # {'_CarModel__wheel_count': 4}

truck = TruckFactory.create({'wheelCount': 4, 'loadInKg': 500})
print(vars(truck))  # {'_CarModel__wheel_count': 4, '_TruckModel__load_in_kg': 500}

Python相关问答推荐

无法使用equals_html从网址获取全文

使用Keras的线性回归参数估计

如何比较numPy数组中的两个图像以获取它们不同的像素

ModuleNotFound错误:没有名为flags.State的模块; flags不是包

. str.替换pandas.series的方法未按预期工作

在Polars(Python库)中将二进制转换为具有非UTF-8字符的字符串变量

Julia CSV for Python中的等效性Pandas index_col参数

数据抓取失败:寻求帮助

在极性中创建条件累积和

如何在表中添加重复的列?

如何并行化/加速并行numba代码?

Python列表不会在条件while循环中正确随机化'

Pandas Data Wrangling/Dataframe Assignment

OpenGL仅渲染第二个三角形,第一个三角形不可见

Python日志(log)模块如何在将消息发送到父日志(log)记录器之前向消息添加类实例变量

不允许 Select 北极滚动?

使用tqdm的进度条

numpy数组和数组标量之间的不同行为

如何重新组织我的Pandas DataFrame,使列名成为列值?

如何在Django模板中显示串行化器错误