2011-11-09 85 views
5

我有以下文件夾結構:的Python - 動態類導入

- MyProject 
    - App1 
     - some_module1.py 
     - some_module2.py 
    - App2 
     - some_other_module1.py 
     - some_other_module2.py 

裏面每個模塊(some_module1.py例如)有從基類擴展,在我的情況下的一類,監製。

我想要做的是動態加載這個類。要做到這一點,我有一個看起來像這樣的「已安裝的應用程序」列表:

INSTALLED_APPS = (
    'App1', 
    'App2', 
) 

我想寫,將檢查每一個「應用程序」包特定生產商類,並確保它從延伸的功能生產者基類。這樣的事情:

module_class = 'some_module1.SomeClass' 

# Loop through each package in the INSTALLED_APPS tuple: 
for app in INSTALL_APPS: 
    try: 
     #is the module_class found in this app? 
     #App1.some_module1.SomeClass - Yes 
     #App2.some_module1.SomeClass - No 

     # is the class we found a subclass of Producer? 
    exception ImportError: 
     pass 

我試過用imp和importlib做實驗,但似乎沒有處理這種導入。無論如何,我能夠實現這一目標嗎?

+0

對不起 - 不可能找出你想要的 - 你的僞代碼不清楚。 Python確實會照顧來自正確位置的相關類,不管怎樣。因此任何App1.Class_都將看到「Producer」,因爲它是在App1模塊中定義的。 – jsbueno

+0

對不起,我試圖儘可能清楚。我編輯了這篇文章,希望它更有意義。 – Hanpan

回答

5

你可能想看看:

  • __import__()導入模塊,知道他們的名字作爲字符串;
  • dir()獲取模塊(屬性,函數等)的所有對象的名稱;
  • inspect.isclass(getattr(<module ref>, <object name>))識別模塊對象中的類;
  • issubclass()確定給定類別的子類別as explained here

使用這些工具,您可以識別給定模塊中繼承給定類的所有類。

我正在使用此機制動態實例化給定模塊中的類,以便在較高級別自動考慮它們的更新。