Python __subclasses __()没有列出子类

Mri*_*lla 7 python

我似乎无法使用该__subclasses__()方法列出所有派生类.这是我的目录布局:

import.py
backends
      __init__.py
    --digger
          __init__.py
          base.py
          test.py
        --plugins
              plugina_plugin.py
Run Code Online (Sandbox Code Playgroud)

import.py我打电话来test.py.test.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__()
Run Code Online (Sandbox Code Playgroud)

我们的问题是该__subclasses__()方法没有显示任何派生类.plugins目录中的所有插件都派生自base.py文件中的基类.

base.py 看起来像这样:

class BasePlugin(object):
    """
    Base
    """
    def __init__(self):
        pass
Run Code Online (Sandbox Code Playgroud)

plugina_plugin.py 看起来像这样:

从基地导入BasePlugin

class PluginA(BasePlugin):
    """
    Plugin A
    """
    def __init__(self):
        pass
Run Code Online (Sandbox Code Playgroud)

任何人都可以帮我解决这个问题吗?我做错了什么?我绞尽脑汁,但我似乎无法弄明白

谢谢.

Mri*_*lla 7

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

    print PluginA.__mro__
    print PluginB.__mro__
Run Code Online (Sandbox Code Playgroud)

我有:

(<class 'plugina_plugin.PluginA'>, <class 'base.BasePlugin'>, <type 'object'>)
(<class 'backends.digger.test.PluginB'>, <class 'backends.digger.base.BasePlugin'>, <type 'object'>)
Run Code Online (Sandbox Code Playgroud)

如您所见,它们都使用相同的基本插件,但限定名称不同.这是因为plugina_plugin.py我是这样导入的BasePlugin:

from base import BasePlugin
Run Code Online (Sandbox Code Playgroud)

代替:

from backends.digger.base import BasePlugin
Run Code Online (Sandbox Code Playgroud)

修复它修复它.