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__
和您需要一个公开
Class2
方法的类,接受裸露的最低上下文,这些上下文可以帮助您找出要实例化的具体实现。
我一旦使用字典就做了类似的事情。我要求您派生的类的初始化功能具有相同的签名以便工作。
用您选择的词典用作键,并将classNames作为值:
Create()
我不确定您认为这是多么的Pythonic/Clean,但它极大地避免了您在上面发布的这张链条。另外,由于您只需要调整字典而不是工厂功能,因此很容易扩展。
TYPE_MAP = {typeA: Class1,
typeB: Class2,
typeC: Class3}
def fabric_function(arg):
return TYPE_MAP[type(arg)](arg)
在Python中,当制作一个实例时,又称类是
called,称为特殊方法
if isinstance...
。您可以像Python中的任何方法/操作员一样覆盖它。typy,一个人在基类(又称接口)中这样做。因此,您的建议是正确的。 实施很简单:主要是您在此“工厂”中提供的代码。 尽管您可能会添加一些细节,例如检查以防止使用意外/不需要的参数或子类时的奇怪行为。
__new__
很好。
实际上,任何事情都允许(但不明智,当您不是要干扰用户的事情时)