如何实现以下功能?
我有1个超类“Vehicle”和2个子类“Car”和“Airplane”。
超类拥有所有共享属性,如“weight”,“color”和“size”。 每个子类都具有特定于类型的属性。汽车的“engine_type”和“变速器”。飞机的“Wing_length”和“wing_height”。
该应用程序通过汽车和飞机的销售广告进行,并且应该为每个广告创建一个对象。
# Advert as string
ad = "For sale: my porsche. weight: 2000kg, black color, diesel engine, 6-gear transmission."
carforsale = Vehicle(ad)
如何制作它以使“carforsale”对象的类型为Car()。不要担心解析广告的逻辑,它们是结构化的json文件。
我读过“工厂模式”。这些是我想要的吗? 任何人都可以为我的问题提供一个解决方案的简单python示例吗?
非常感谢!
答案 0 :(得分:2)
是的,您可以使用工厂模式。 Factory类将为您提供对象的创建方式的封装。但是,在Python中,您不需要类,因此工厂函数get_vehicle
将为您提供一种基于您提供的json作为函数参数的不同车辆的便捷方法。您的示例很简单,我在工厂中所做的事情可以在基类Vehicle
类中完成,但是对于更复杂的示例,将该逻辑封装在单独的Factory类或顶层中可能很有用。级别函数,如本例所示。你可以做的最糟糕的事情是在几个地方(在上面提到的类之外)使用一堆if/else
语句,决定需要创建什么样的对象应该在一个地方。原因是,你不需要重复自己。
以下是Wikipedia的定义:
工厂方法模式是使用工厂的创建模式 处理无需创建对象的问题的方法 指定将要创建的对象的确切类。这是 通过调用工厂方法创建对象来完成 - 指定 在一个接口中,由子类实现,或在一个 基类,并可选择由派生类重写,而不是由 调用构造函数。
这是一个简单的代码。如果我理解你的问题,你应该使用这样的东西。
class Vehicle:
def __init__(self, json_obj):
self.color = json_obj['color']
class Car(Vehicle):
def __init__(self, json_obj):
super(Car, self).__init__(json_obj)
self.engine_type = json_obj['engine_type']
def __repr__(self):
return 'Car {} {}'.format(self.color, self.engine_type)
class Airplane(Vehicle):
def __init__(self, json_obj):
super(Airplane, self).__init__(json_obj)
self.wing_length = json_obj['wing_length']
type_to_class = {'car': Car, 'airplane': Airplane}
def extract_type(json_obj):
# decide how to get the type, replace the return statement with your logic
return 'car'
def get_vehicle(json_obj):
vehicle_type = extract_type(json_obj)
return type_to_class[vehicle_type](json_obj)
if __name__ == '__main__':
car = get_vehicle({'color': 'red', 'engine_type': 'v_type'})
print(car)
更新:阅读@ juanpa.arrivillaga建议后更新了代码。使用“顶级”函数是Pythonic方式,所以让我们这样做:)我一直在纯粹的面向对象语言中更加集中地使用设计模式,所以使用Factory类看起来更自然,但它不是非常必要,所以让我们有更清晰的代码。