我有一个类,Dog
,以及几个子类,如Cow
,Lion
,Animal
等。
eats(Food f)
是一个抽象类,它有一个抽象的静态方法eats
。
所有这些子类都会实现True
,并根据每只动物返回False
或Animal
。
我如何迭代这些内容并创建一个新的eats
,其类型Animal
是特定食物而无需手动输入每个类?
例如,我希望得到一个类型为Cow
的对象吃草,而不是实际创建一个新的Animal
。
查找eats
的子类可能是一个部分,但我更感兴趣的是实际迭代某些类列表并在每个类上运行{{1}},直到找到一个返回True的类然后创建该类的新对象。
感谢。
答案 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()
这基本上完全符合您的描述,因此不需要任何解释。
但它只获得直接的子类;如果您确实需要所有子类,无论它们嵌套的深度如何,请参阅链接文章。