动态创建适当子类的对象

时间:2017-05-29 19:16:22

标签: python oop inheritance

如何实现以下功能?

我有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示例吗?

非常感谢!

1 个答案:

答案 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类看起来更自然,但它不是非常必要,所以让我们有更清晰的代码。