Python设计模式:返回不同对象的类,具体取决于参数

问题描述 投票:0回答:3
这个问题涉及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
负责对象制作过程,但我不确定这是一种干净的方法。也许我应该使用多个继承,并在构造函数中确定哪个父级为真实?
	
i我假设
__new__

python oop design-patterns abstract-class multiple-inheritance
3个回答
1
投票
是相关的(例如,“正方形”和“圆”都是“数字”)。您所描述的是抽象工厂。

您需要一个公开

Class2
方法的类,接受裸露的最低上下文,这些上下文可以帮助您找出要实例化的具体实现。

我一旦使用字典就做了类似的事情。我要求您派生的类的初始化功能具有相同的签名以便工作。

用您选择的词典用作键,并将classNames作为值:

Create()
我不确定您认为这是多么的Pythonic/Clean,但它极大地避免了您在上面发布的这张链条。另外,由于您只需要调整字典而不是工厂功能,因此很容易扩展。


1
投票
在Python中这很容易。使用

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

在Python中,当制作一个实例时,又称类是
called
,称为特殊方法

if isinstance...

。您可以像Python中的任何方法/操作员一样覆盖它。
typy,一个人在基类(又称接口)中这样做。因此,您的建议是正确的。

实施很简单:主要是您在此“工厂”中提供的代码。 尽管您可能会添加一些细节,例如检查以防止使用意外/不需要的参数或子类时的奇怪行为。

0
投票
__new__

很好。

实际上,任何事情都允许(但不明智,当您不是要干扰用户的事情时)

最新问题
© www.soinside.com 2019 - 2025. All rights reserved.