我试着这样做
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)
不适合干练。代码将在每个类中重复。 如何根据扎实和枯燥的实践来组织这个代码
要解决这个问题,只需将check
DEFAULT
从__new__
方法移到___init__
。就像这样:相关问题 更多 >
编程相关推荐