Python:检查模块挑选出某种类型的类?

时间:2011-02-16 00:50:19

标签: python

我有一个模块,其中定义了实现我的“策略”的所有类。

class Policy_Something(Policy_Base):
    slug='policy-something'
    ...

class Policy_Something_Else(Policy_Base):
    slug='policy-something-else'
    ...

我需要创建从slug到class的映射。类似的东西:

slug_to_class = {
    'policy-something': Policy_Something,
    'policy-something-else': Policy_Something_Else
}

我在思考而不是通过检查模块并查找从Policy_Base继承的类来自动创建slug_to_class(类似于unittest如何找到测试,我假设)。

我不应该这样做吗?如果没有,我将如何做到这一点?

1 个答案:

答案 0 :(得分:2)

由于您的“策略”类继承自Policy_Base,为什么不导入所有相关模块然后执行类似的操作?:

import re

def slugify(s):
    return re.sub(r'\W+', '-', s.lower().replace('_', '-'))

def get_slug_to_class_items(policy_class):
    yield (slugify(policy_class.__name__), policy_class)
    for subclass in policy_class.__subclasses__():
        for slug, subclass in get_slug_to_class_items(subclass):
            yield (slug, subclass)

slug_to_class = dict(get_slug_to_class_items(Policy_Base))
# print repr(slug_to_class)

get_slug_to_class_items函数查找从Policy_Base继承的类(在类层次结构上递归迭代)并返回一个2元组(slug,class)的生成器,将其设置为预期的项目dict

请注意,在调用get_slug_to_class_items之前,必须导入所有带有“策略”类的模块。