python - Python设计模式:根据参数返回不同对象的类
问题描述
这个问题涉及 Python 中的设计模式,是针对软件设计人员的。
我有几个类继承自同一个抽象类(它们都有相似的接口,但成员函数有非常不同的实现)。我想创建一个结合(包装)所有这些的类(或其他东西)。通过组合,我的意思是根据输入参数创建并返回某个类的对象的模式。最简单的解决方案是 Python 函数:
def fabric_function(arg):
if isinstance(arg, float):
return Class1(arg)
if isinstance(arg, str):
return Class2(arg)
有没有更好的模式可以做到这一点?我真的更希望它是一个返回对象Class1
或Class2
取决于参数的类。我希望用户创建一个类Class
的实例,该实例作为Class1
或Class2
取决于输入参数的实例运行,因此用户不必决定使用哪个参数,并且在所有情况下都type(obj)
应该输出。Class
在这种情况下,我可以修改__new__
负责对象制作过程的成员函数,但我不确定这是一种干净的方法。也许我应该使用多重继承并在构造函数中决定真正继承哪个父类?
解决方案
我曾经使用字典做过类似的事情。我要求派生类的 init 函数具有相同的签名才能工作。
使用您选择的某些不可变类型的字典作为键并将类名作为值:
TYPE_MAP = {typeA: Class1,
typeB: Class2,
typeC: Class3}
def fabric_function(arg):
return TYPE_MAP[type(arg)](arg)
我不完全确定你是如何看待 pythonic/clean 的,但它极大地帮助我避免了if isinstance...
你在上面发布的这个链。它也很容易扩展,因为你只需要调整字典而不是工厂函数。
推荐阅读
- vb.net - 如何读取 txt 文件中的行,然后在 TextBox VB.NET 中仅显示某些字符?
- assembly - _SFR_IO8(0x04) 在做什么?AVR
- spring - Spring - 将外部实体设置为属性
- boot - Android 在启动过程中挂起并出现致命异常 WifiStateMachine 和 JavaBinder
- algorithm - 给定无向连接图的两个节点之间的最短路径数
- javascript - Nativescript Textfield 文本和提示属性未在 IOS 中显示
- java - 在 Travis CI 中进行原生镜像编译的 GraalVM
- java - 单击按钮时如何更改布局的背景图像
- javascript - AJAX成功内的动态appendChild
- javascript - 单击后使用 JavaScript 打开一个新的(空)选项卡并添加 URL