首页 > 解决方案 > 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__负责对象制作过程的成员函数,但我不确定这是一种干净的方法。也许我应该使用多重继承并在构造函数中决定真正继承哪个父类?

标签: pythonoopdesign-patternsabstract-classmultiple-inheritance

解决方案


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

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

TYPE_MAP = {typeA: Class1,
            typeB: Class2,
            typeC: Class3}

def fabric_function(arg):
    return TYPE_MAP[type(arg)](arg)

我不完全确定你是如何看待 pythonic/clean 的,但它极大地帮助我避免了if isinstance...你在上面发布的这个链。它也很容易扩展,因为你只需要调整字典而不是工厂函数。


推荐阅读