如何动态确定要创建哪个Python子类?

2024-09-04 02:01:25 发布

您现在位置:Python中文网/ 问答频道 /正文

假设我有一个Word类,它有ShortWordLongWord子类。有没有办法根据给定的输入动态确定实例化哪个子类?我的意思是我可以定义一个单独的函数,比如

def instantiate(text):
    if len(text) < 5:
        return ShortWord(text)
    else:
        return LongWord(text)

但这感觉不太优雅(因为没有更好的词)。有什么好办法吗?我在其他语言中也发现了一些类似的问题,但没有特定于python的


Tags: 实例函数textlenreturnif定义def
1条回答
网友
1楼 · 发布于 2024-09-04 02:01:25

我将在基类中定义一个@staticmethod来进行确定

您可能需要在基类中定义一个__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)实例化

相关问题 更多 >