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

wtf*_*ode 3 python class

我有一个特定的类,即Animal,以及几个子类Dog,如CowLion、 等。

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

所有这些子类都会实现eats,并且根据每种动物的不同,将返回TrueFalse.

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

例如,我想获得一个Animal吃草类型的对象,而不实际创建一个新的Cow.

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

谢谢。

glg*_*lgl 6

您可以迭代所有子类,进行检查,然后获取第一个匹配的子类:

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()
Run Code Online (Sandbox Code Playgroud)

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

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