我有下面的代码清单:对象工厂产生一个或多个对象
def f(cls, value):
# cls is a class
# value is a string value
if cls == str:
pass # value is already the right type
elif cls == int:
value = int(value)
elif cls == C1:
value = C1(value)
elif cls == C2:
value = C2(value)
elif cls == C3
# in this case, we convert the string into a list of objects of class C3
value = C3.parse(value)
else
raise UnknownClass(repr(cls))
return value
很明显,我想喜欢的东西来替代它:
def f(cls, value)
return cls(value)
不幸的是,在一些case(如果cls == C3),输入的解析结果将成为该类的对象列表,而不仅仅是一个对象。什么是一个干净的方式来处理这个问题?我可以访问所有的课程。
没有办法从X()返回X的列表而不是X,我假设? – max 2010-09-07 05:53:30
@max,当你写一个'class X'时,你可以重载'X .__ new__'来返回你想要的任何东西(如果不是'X'实例,'X .__ init__'不会被调用) - 当然这可能会有严重的缺点,例如很难有一个单一的“X”实例(那么如何让实例放入该列表中?) - 这不是不可能的,但是非常不方便。 'classmethod'通常是构建“替代”构造函数的更好方法。 – 2010-09-07 13:51:19