如何将部分与配置文件中的类相关联?

时间:2017-08-25 16:11:26

标签: python dependency-injection configuration

假设我有一个程序来检索不同类型动物的信息。我有命名元组中表示的动物类型,我从配置文件构建:

的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] = ??   

我可能会得到我想要的一些邪恶的反思黑客。但是有更好的方法来解决这个问题吗?

1 个答案:

答案 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))