python - 哪种真正的方法可以创建几个具有可从其他类继承的默认值的类并使用一个通用行为 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 实践组织此代码?
解决方案
要解决这个问题,只需将检查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)
推荐阅读
- python - 如何从 tensorflow einsum 结果中获取 numpy 数组?
- dsl - 如何在空手道中使用 if 条件进行动态响应代码
- apache-spark - 连接被拒绝:尝试连接到远程 Spark 集群时 spark.example.com/xxx.xxx.xxx.xxx:7077
- java - Java Semaphore availablePermits with ThreadPool
- c++11 - Decltype Bug Gcc 无法编译
- tensorflow - 为什么我不能使用 CMake 用 VS2017 编译 tensorflow-r1.99?
- javascript - 如何在 jQuery 中使用 for 循环?
- android - 单击可扩展列表视图中的子项后如何打开新活动
- python-3.x - 参数“c”和“cmap”在 matplotlib 散点图中如何表现?
- python-3.x - 使用函数或其他方法在两个列表之间的特定索引中查找元素