首页 > 解决方案 > 哪种真正的方法可以创建几个具有可从其他类继承的默认值的类并使用一个通用行为 init

问题描述

我试试这个方法

def build_car_from_dict(car_dict):
    marque = car_dict.get('marque')
    marque_class = CarMarqueCollection.get(marque)
    if marque_class:
        return marque_class(car_dict)
    else:
        return CarDict(car_dict)


class CarDict(dict):
    def __new__(cls, car_dict=None):
        if car_dict is None and hasattr(cls, 'DEFAULT'):
            car_dict = cls.DEFAULT
        return super().__new__(dict, car_dict)


class BersedesMenzCar(CarDict):
    DEFAULT = {'marque': 'Bersedes-Menz', 'wheels': 4, 'doors': 3}
    def signal(self):
       print('beep')


class YototaCar(CarDict):
    DEFAULT = {'marque': 'Yotota', 'wheels': 4, 'doors': 5}
    def signal(self):
       print('beep-beeeeee')


class LevrocheCar(CarDict):
    DEFAULT = {'marque': 'Levroche', 'wheels': 5, 'doors': 3}
    def signal(self):
       print('beep-beep')


CarMarqueCollection = {
    'Bersedes-Menz': BersedesMenzCar,
    'Yotota': YototaCar,
    'Levroche': LevrocheCar
}

if __name__ == '__main__':
    some_dict = {}
    build_car_from_dict(some_dict)

'DEFAULT'但是检查类字段并在父类中使用它们是不对的。如果__init__像这样在每个品牌类中覆盖:

class YototaCar(CarDict):
def __init__(self, car_dict=None):
    if car_dictis None:
        car_dict= self.DEFAULT
    super().__init__(car_dict)

它不适合 DRY 练习。代码将在每个类中重复。如何根据 SOLID 和 DRY 实践组织此代码?

标签: pythonpython-3.x

解决方案


要解决这个问题,只需将检查DEFAULT__new__方法移动到___init__. 像那样:

class CarDict(dict):
    def __init__(self, car_dict=None):
        if car_dict is None and hasattr(self, 'DEFAULT'):
            car_dict = self.DEFAULT
        return super().__init__(car_dict)

推荐阅读