Python - 迭代扩展类的类列表?

时间:2015-11-15 21:35:00

标签: python class

我有一个类,Dog,以及几个子类,如CowLionAnimal等。

eats(Food f)是一个抽象类,它有一个抽象的静态方法eats

所有这些子类都会实现True,并根据每只动物返回FalseAnimal

我如何迭代这些内容并创建一个新的eats,其类型Animal是特定食物而无需手动输入每个类?

例如,我希望得到一个类型为Cow的对象吃草,而不是实际创建一个新的Animal

查找eats的子类可能是一个部分,但我更感兴趣的是实际迭代某些类列表并在每个类上运行{{1}},直到找到一个返回True的类然后创建该类的新对象。

感谢。

1 个答案:

答案 0 :(得分:3)

您可以遍历所有子类,执行检查,然后获取匹配的第一个:

def create_animal_eating(food):
    gen = (subclass for subclass in Animal.__subclasses__() if subclass.eats(food))
    subclass = next(gen, None)
    if subclass is None:
        raise ValueError("No animal eats " + repr(food))
    new_obj = subclass()

这基本上完全符合您的描述,因此不需要任何解释。

但它只获得直接的子类;如果您确实需要所有子类,无论它们嵌套的深度如何,请参阅链接文章。