2010-10-20 70 views
0

我试图创造一种相信(在我的无知中)被称为类工厂。从本质上讲,我有一个父类,我想采取一个__init__的论点,并成为几个孩子类之一。我发现推荐StackOverflow上here这样的一个例子,它看起来像这样:改变__type__的后果

class Vehicle(object): 
    def __init__(self, vtype): 
    self.vtype = vtype 
    if vtype=='c': 
     self.__class__ = Car 
    elif vtype == 't': 
     self.__class__ = Truck 

heard,改变__type__可能是危险的。这种方法有没有消极的方法?我会使用一个函数来动态创建对象,但它不适用于我正在使用的现有代码。它期望我计划进行动态类型更改的课程。

谢谢!

+1

改变'__type__'比更危险;这太疯狂了。有更好的方法来进行。 – 2010-10-20 22:49:31

回答

-1

不要这样做。改为Override __new__()

+0

“这种方法有没有消极的方法?”不是一个真正的答案。 – 2010-10-20 22:06:58

1

我认为一个类厂被定义为返回一个类(不是实例)的可调用:

def vehicle_factory(vtype): 
    if vtype == 'c': 
     return Car 
    if vtype == 't': 
     return Truck 

VehicleClass = vehicle_factory(c) 
vehicle_instance_1 = VehicleClass(*args, **kwargs) 
VehicleClass = vehicle_factory(t) 
vehicle_instance_2 = VehicleClass(*args, **kwargs) 
+0

“我认为一个类工厂被定义为一个可返回类(不是实例)的可调用函数”你为什么这么说?为什么我会创建一个返回类的类,之后我应该立即使用它们?我想你很想知道“class factory”的名字 – mouad 2010-10-20 23:24:57

+0

@singularity:当你的类没有在源文件中定义,并且你需要动态构建类时,例如当类属性和方法基于存储在数据库中的动态参数。我使用这种方法动态地创建django表单。 – 2010-10-21 03:21:41

+0

我不明白你为什么要告诉我:)我认为我的评论很明确,但我会重复一遍,当你说班级工厂时,我在争论一个班级工厂(工厂模式)的定义。应该返回类而不是实例,因为它不是;而且我告诉过你,你错过了理解“班级工厂”这个名字,以使班级工厂更容易是一个“实施工厂模式的班级”,而不是像你所想的那样“退班的工厂模式”。希望这可以清除的东西:) – mouad 2010-10-21 10:05:34