我有一个模块,其中定义了实现我的“策略”的所有类。
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如何找到测试,我假设)。
我不应该这样做吗?如果没有,我将如何做到这一点?
答案 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
之前,必须导入所有带有“策略”类的模块。