2011-02-16 43 views
2

我有一个模块,其中实现我的“政策”的所有类都已定义。Python:检查模块挑选某些类型的类?

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

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

我需要创建一个从slu mapping到类的映射。喜欢的东西:

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

我想通过检查模块并寻找从Policy_Base继承的类自动创建slug_to_class代替(类似于单元测试如何找到测试中,我假设)。

任何理由我不应该那样做?如果没有,我将如何做到这一点?

回答

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之前,具有“策略”类的所有模块都必须导入。

+0

policy_class .__子类__()看起来正是我所需要的,非常感谢。 – Parand 2011-02-16 01:34:28