Python __subclasses __()没有列出子类

时间:2010-06-15 19:25:43

标签: 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

有人可以帮我解决这个问题吗?我做错了什么?我绞尽脑汁但我似乎无法弄清楚

感谢。

2 个答案:

答案 0 :(得分:7)

没有其他base.py文件。我使用的是Python 2.6的WinXP(SP2)。我在名为test.py的{​​{1}}文件中添加了另一个类,该文件使用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

解决这个问题。

答案 1 :(得分:0)

也许插件正在寻找隐藏在某处的另一个base.py(例如插件目录) 使用python -v运行,看看是否有两个不同的base.py正在导入

您还可以查看PluginA.__mro__并确认其中的BasePlugin是否正确