使用从其他类继承的默认值创建多个类并使用一个常规behavivor ini的真正方法是什么

2024-09-27 07:21:58 发布

您现在位置:Python中文网/ 问答频道 /正文

我试着这样做

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)

不适合干练。代码将在每个类中重复。 如何根据扎实和枯燥的实践来组织这个代码


Tags: selfnonedefaultreturnifdefbeepcar
1条回答
网友
1楼 · 发布于 2024-09-27 07:21:58

要解决这个问题,只需将checkDEFAULT__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)

相关问题 更多 >

    热门问题