gpt4 book ai didi

Python子类工厂

转载 作者:行者123 更新时间:2023-12-02 01:05:03 25 4
gpt4 key购买 nike

我有许多单个父类的子类,并希望根据序列化数据中的字符串实例化它们。我的方法是将实例化字符串映射到类,然后使用工厂方法创建相应的对象:

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 作为全局字典,但由于尚未定义子类(当然,它们必须在父类(super class)之后定义),我无法在声明中将其定义为父类(super class)的成员.我当然可以事后将类(class) map 分配到类(class)中:
Superclass.CLASSMAP = {...}

并让 Superclass 的 get_instance() 方法引用尚不存在的字段,但它似乎更笨拙且容易出错。

整个模式是否有更 Pythonic 的方法?

最佳答案

如果你让你的父类(super class)成为继承自对象的新式类,你可以使用 cls.__subclasses__() 动态解决这个问题。 :

class Superclass(object):
@classmethod
def get_instance(cls, string):
return next(c for c in cls.__subclasses__() if c.__name__.lower() == string)()

一种混合方法,结合了动态添加类的优势,同时仍然具有 O(1)类查找:
class Superclass(object):
@classmethod
def get_instance(cls, string):
return MAPPING[string]()

class Foo(Superclass):
lookup = 'foo'

class Bar(Superclass):
lookup = 'bar'

MAPPING = {c.lookup: c for c in Superclass.__subclasses__()}

关于Python子类工厂,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48165626/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com