2010-06-15 30 views
6

__subclasses__() yöntemini kullanarak türetilmiş tüm sınıfları listeleyemiyorum.Python __subclasses __() alt sınıfları listeleme

import.py 
backends 
     __init__.py 
    --digger 
      __init__.py 
      base.py 
      test.py 
     --plugins 
       plugina_plugin.py 

import.py itibaren i test.py arıyorum: İşte benim dizin düzeni bu. test.py sırayla plugins dizinindeki tüm dosyaları yineler ve tümünü yükler. test.py şuna benzer:

import os 
import sys 
import re 

sys.path.append(os.path.join(os.path.abspath(os.path.dirname(os.path.abspath(__file__))))) 
sys.path.append(os.path.join(os.path.abspath(os.path.dirname(os.path.abspath(__file__))), 'plugins')) 

from base import BasePlugin 

class TestImport: 
    def __init__(self): 
     print 'heeeeello' 

     PLUGIN_DIRECTORY = os.path.join(os.path.abspath(os.path.dirname(os.path.abspath(__file__))), 'plugins') 

     for filename in os.listdir (PLUGIN_DIRECTORY): 
      # Ignore subfolders 
      if os.path.isdir (os.path.join(PLUGIN_DIRECTORY, filename)): 
       continue 
      else: 
       if re.match(r".*?_plugin\.py$", filename): 
        print ('Initialising plugin : ' + filename) 
        __import__(re.sub(r".py", r"", filename)) 

     print ('Plugin system initialized') 
     print BasePlugin.__subclasses__() 

__subclasses__() yöntemi, herhangi bir türetilmiş sınıfları göstermediği sorun bize. plugins dizindeki tüm eklentiler, base.py dosyasındaki bir temel sınıftan türetilir.

base.py

şuna benzer: Baz ithalat BasePlugin gelen

class PluginA(BasePlugin): 
    """ 
    Plugin A 
    """ 
    def __init__(self): 
     pass 

kimse bu konuda bana yardımcı olabilir:

class BasePlugin(object): 
    """ 
    Base 
    """ 
    def __init__(self): 
     pass 

plugina_plugin.py

şöyle? Neyi yanlış yapıyorum? Beyinlerimi bunun üzerine koydum ama bunu anlayamıyorum

Teşekkürler.

+0

'Initialising plugin: plugina_plugin' adlı iletiyi görüyor musunuz? – unutbu

+0

Evet. O açılır. Öyle görünüyor ki sınıf bile içe aktarılıyor ama '__subclasses__' yöntemi bir sebepten dolayı listelemiyor. –

+0

Sorunu yeniden oluşturamadım. basePlugin .__ subclasses __() baskısı, [] 'değerini verir.Belki de dizin yapısını kopyalarsanız ve kodu mümkün olan en basit forma (eğer problem devam ederse her bir değişiklik testi ile) ayrıştırmaya devam ederseniz, bazı orta aşamada sorunun kaynağına dair bir ipucu bulacaksınız. Örneğin, test.py'deki tüm yabancı kodlardan kurtulun, dizin yapısını basitleştirin, import.py'den kurtulun, vs ... – unutbu

cevap

4

olduğunu teyit edebilir görmek için. Python 2.6 ile bir WinXP (SP2) kullanıyorum. Temel sınıf olarak BasePlugin kullanılan PluginB adlı test.py dosyama başka bir sınıf ekledim. i

print PluginA.__mro__ 
    print PluginB.__mro__ 

ne zaman ı got:

Gördüğünüz gibi, her ikisi de aynı temel eklentisi kullanıyor ancak kalifiye isimler farklıdır
(<class 'plugina_plugin.PluginA'>, <class 'base.BasePlugin'>, <type 'object'>) 
(<class 'backends.digger.test.PluginB'>, <class 'backends.digger.base.BasePlugin'>, <type 'object'>) 

.

from base import BasePlugin 

yerine:

from backends.digger.base import BasePlugin 

bu düzelttim Tespit plugina_plugin.py içinde böyle BasePlugin ithal ediyor olmasıydı.

+0

Bu sorundan kazandığınız için teşekkür ederiz! İki farklı nitelikli isme sahip bir nesnenin iki bağımsız takma adı olduğunu düşünebilirdi! – advait

0

Belki de eklentiler başka bir yerde (örneğin eklenti dizini) gizlenen başka bir base.py buluyor. İki farklı base.py

ithal alıyorsanız eğer python -v ile
Run Ayrıca PluginA.__mro__ bakıp BasePlugin başka hiçbir base.py dosyalar vardı doğru bir