2024-09-04 02:01:25 发布
网友
假设我有一个Word类,它有ShortWord和LongWord子类。有没有办法根据给定的输入动态确定实例化哪个子类?我的意思是我可以定义一个单独的函数,比如
Word
ShortWord
LongWord
def instantiate(text): if len(text) < 5: return ShortWord(text) else: return LongWord(text)
但这感觉不太优雅(因为没有更好的词)。有什么好办法吗?我在其他语言中也发现了一些类似的问题,但没有特定于python的
我将在基类中定义一个@staticmethod来进行确定
@staticmethod
您可能需要在基类中定义一个__init_subclass__,以便至少知道存在哪些类,因为在定义基类之前您不知道子类
__init_subclass__
class Word(object): _tr = {} # Type registry @staticmethod def instantiate(text): if len(text) < 5: cls = __class__._tr.get('ShortWord') else: cls = __class__._tr.get('LongWord') return cls(text) if cls is not None else None def __init_subclass__(cls): __class__._tr[cls.__name__] = cls class ShortWord(Word): pass class LongWord(Word): pass
看到评论后我仔细考虑了一下,这是另一种方法。不想为一个问题提交两个答案。更新:多亏了@chepner的评论,我进一步清理了它
class Word(object): @staticmethod def instantiate(text): if len(text) < 5: return ShortWord(text) else: return LongWord(text) class ShortWord(Word): pass class LongWord(Word): pass
用val = Word.instantiate(text)实例化
val = Word.instantiate(text)
我将在基类中定义一个
@staticmethod
来进行确定您可能需要在基类中定义一个
__init_subclass__
,以便至少知道存在哪些类,因为在定义基类之前您不知道子类看到评论后我仔细考虑了一下,这是另一种方法。不想为一个问题提交两个答案。更新:多亏了@chepner的评论,我进一步清理了它
用
val = Word.instantiate(text)
实例化相关问题 更多 >
编程相关推荐