2011-02-16 34 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