假设我有一个程序来检索不同类型动物的信息。我有命名元组中表示的动物类型,我从配置文件构建:
的config.ini
[Cat]
limb_count = 4
size_class = Small
animals.py
AnimalData = namedtuple('Animal', 'type limb_count size_class')
现在,我从不同的网站上搜集每只动物的数据,因此我的AnimalStatsRepository
设置如下:
class AnimalStatsRepository(object):
def __init__(self):
self._queries_by_animal = {
'Cat': CatQuery(),
'Dog': DogQuery(),
'Zebra': ZebraQuery()
}
def get_birthrate(self, animal):
return self._queries_by_animal[animal.type].get_birthrate()
# And also do database stuff that's not relevant to the question
我希望能够根据我从配置文件中读取的动物数据在运行时设置_queries_by_animal
字典。如下所示:
class AnimalStatsRepository(object):
def __init__(self, animals_data):
self._queries_by_animal = {}
for animal in animals_data:
self._queries_by_animal[animal.type] = ??
我可能会得到我想要的一些邪恶的反思黑客。但是有更好的方法来解决这个问题吗?
答案 0 :(得分:0)
可以使用工厂方法从配置文件中的文本创建正确的查询。实现可能如下所示:
def animal_query_factory(animal_name):
if animal_name == 'Cat':
return CatQuery()
if animal_name == 'Dog':
return DogQuery()
raise NotImplementedError('Unable to handle animal: {}'.format(animal_name))