我有许多单一父类的子类,想根据序列化数据中的字符串实例化它们。我的方法是将实例化字符串映射到类,然后使用工厂方法创建相应的对象:
class Superclass:
@classmethod
def get_instance(cls, string):
return CLASSMAP[string]()
def name(self):
pass
class Foo(Superclass):
def name(self):
return "my name is Foo"
class Bar(Superclass):
def name(self):
return "i'm Bar"
class Baz(Superclass):
def name(self):
return "i am called Baz"
CLASSMAP = {
'foo': Foo,
'bar': Bar,
'baz': Baz,
}
我不喜欢将CLASSMAP作为全局字典,但是由于子类还没有定义(当然,它们必须在超类之后定义),所以我不能在声明中将其定义为超类的成员。当然,我可以在类之后将类映射分配到类中:
Superclass.CLASSMAP = {...}
可以将超类的 get_instance() 方法引用尚不存在的字段,但这似乎更加笨重且容易出错。
整个模式是否存在更多符合 Python 风格的方法?
CONSTANT
字典对我来说没问题。 - juanpa.arrivillagaCLASSMAP
这样的东西封装到另一个原始类中,并编写包装函数以使用私有变量来完成工作,这总是一个好主意! - NoobEditor