Python设计模式:根据参数返回不同对象的类



这个问题涉及Python中的设计模式,是向软件设计者提出的。

我从同一个抽象类继承了几个类(它们都有相似的接口,但成员函数有非常不同的实现(。我想创建一个类(或其他东西(,将所有这些类组合(封装(在一起。我所说的组合是指一种模式,它根据输入参数创建并返回某个类的对象。最琐碎的解决方案是Python函数:

def fabric_function(arg):
if isinstance(arg, float):
return Class1(arg)
if isinstance(arg, str):
return Class2(arg)

有更好的模式吗?我真的更希望它是一个根据参数返回Class1Class2对象的类。我希望用户根据输入参数创建类Class的实例,该实例作为Class1Class2的实例操作,这样用户就不必决定使用它们中的哪一个,并且type(obj)的输出在所有情况下都应该是Class。在这种情况下,我可以修改负责对象生成过程的成员函数__new__,但我不确定这是一种干净的方法。也许我应该使用多重继承,并在构造函数中决定真正继承哪个父类?

我认为Class1Class2在某种程度上是相关的(例如,"正方形"one_answers"圆形"都是"图形"(。你所描述的是一个抽象工厂。

您需要一个公开Create()方法的类,接受最基本的上下文,这将帮助您找到要实例化的具体实现。

我曾经用字典做过类似的事情。我要求派生类的init函数具有相同的签名才能工作。

使用一个字典,将您选择的一些不可变类型作为关键字,并将类名作为值:

TYPE_MAP = {typeA: Class1,
typeB: Class2,
typeC: Class3}
def fabric_function(arg):
return TYPE_MAP[type(arg)](arg)

我不确定你认为这有多像蟒蛇/干净,但它极大地帮助了我避免了你在上面发布的if isinstance...链。此外,它很容易扩展,因为您只需要调整字典,而不需要调整工厂函数。

最新更新