Python __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

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

谢谢。

最佳答案

没有其他 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

修复这个问题。

关于Python __subclasses__() 没有列出子类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3048337/

相关文章:

python - 我们可以在spyder中直接使用One Hot Encoding而不使用标签编码来处理分类数据吗

python - Pyspark:TaskMemoryManager:无法分配页面:需要错误分析帮助

python - 为什么 pip freeze 返回一些 "gibberish"而不是 package==VERSION?

python - 设置一个python进程名称

python - 自动打印下载的文件

python - 使用 spaCy 去除标点符号;属性错误

python - 跨文件循环依赖的类型提示

python - pandas - 如何仅将 DataFrame 的选定列保存到 HDF5

c++ - 使用 Qt Creator 编译 PythonQt

python - 对 Panda Dataframe 中的一系列列表进行分组