Python __subclasses __()未列出子类

问题描述:

我似乎无法使用__subclasses__()方法列出所有派生类。这里是我的目录布局:Python __subclasses __()未列出子类

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

import.py我打电话test.pytest.py依次迭代plugins目录中的所有文件并加载它们全部。 test.py看起来是这样的:

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__()方法不显示任何派生类。 plugins目录中的所有插件都来自base.py文件中的基类。

base.py看起来是这样的:

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

plugina_plugin.py看起来是这样的:

从基地进口BasePlugin

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

谁能帮我这个?我做错了什么?我绞尽脑汁,但我似乎无法解决这个问题

谢谢。

+0

您是否看到消息'Initialising plugin:plugina_plugin'? – unutbu 2010-06-15 19:42:42

+0

是的。它弹出。看起来类甚至被导入,但'__subclasses__'方法由于某种原因没有列出它。 – 2010-06-15 19:48:13

+0

我一直无法重现该问题。 '打印BasePlugin .__子类__()'产生'[]''。也许如果你复制目录结构并将代码放在最简单的可能的形式下(如果问题依然存在,那么每次更改都要测试),在某个中间阶段,你会发现问题的根源。例如,摆脱test.py中的所有无关代码,简化目录结构,摆脱import.py等等。 – unutbu 2010-06-15 20:12:54

没有其他base.py文件。我在使用Python 2.6的WinXP(SP2)上。我在我的test.py文件中添加了另一个类,名为PluginB,它使用BasePlugin作为基类。当我做了

print PluginA.__mro__ 
    print PluginB.__mro__ 

我:

(<class 'plugina_plugin.PluginA'>, <class 'base.BasePlugin'>, <type 'object'>) 
(<class 'backends.digger.test.PluginB'>, <class 'backends.digger.base.BasePlugin'>, <type 'object'>) 

正如你可以看到,他们使用相同的基本插件,但合格的名称是不同的两种。这是因为在plugina_plugin.py我进口BasePlugin这样的:

from base import BasePlugin 

相反的:

from backends.digger.base import BasePlugin 

修复这个固定。

+0

感谢您挖掘这个问题!谁会认为具有两个不同限定名称的对象有两个独立的别名! – advait 2011-08-30 18:32:08

也许插件找到另一个base.py隐藏在某处(例如插件目录)。
python -v运行,看看两个不同的base.py越来越进口

你也可以看看PluginA.__mro__并确认在BasePlugin有正确的