在各种单文件Python脚本中查找类的所有子类

在各种单文件Python脚本中查找类的所有子类,python,subclass,Python,Subclass,我有一个文件夹(“根”),其中包含各种子文件夹和*.py文件“root”不是一个包,只是一个包含不同脚本的文件夹。我正在尝试查找“root”中包含从特定基类继承的类的所有脚本。目标是为用户提供一个特定的脚本选择 查找子类最明显的方法是使用\uuuuuuu subclasses\uuuuuu(),但这需要加载所有类(即,对类调用\uuuuuu subclasses\uuuuuu(),将只查找当前加载的子类),当文件夹中充满单个脚本时,这并不是很好 我尝试在“root”中搜索所有*.py文件,然后尝

我有一个文件夹(“根”),其中包含各种子文件夹和*.py文件“root”不是一个包,只是一个包含不同脚本的文件夹。我正在尝试查找“root”中包含从特定基类继承的类的所有脚本。目标是为用户提供一个特定的脚本选择

查找子类最明显的方法是使用
\uuuuuuu subclasses\uuuuuu()
,但这需要加载所有类(即,对类调用
\uuuuuu subclasses\uuuuuu()
,将只查找当前加载的子类),当文件夹中充满单个脚本时,这并不是很好

我尝试在“root”中搜索所有*.py文件,然后尝试使用
importlib
逐个导入它们,这不仅速度慢得令人痛苦(正如您可能想象的那样),而且我甚至无法让它正常工作

基类被定义为
MyBaseClass(带有_元类(abc.ABCMeta,SomeOtherClass))
我对abc的了解很少,所以我不确定它是否提供了任何有帮助的功能。(我正在调查此事)

Java有一个整洁的Lookup包(),它允许您标记类,然后使用某个标记查找所有类。(它通常在罐子的范围内进行查找,因此不完全相同)

我的问题是:有什么像样的方法让它发挥作用吗

编辑 最初作为评论发布,放在此处以提高可见性:

def all_files(directory):
    for path, dirs, files in os.walk(directory):
        for f in files:
            if f.endswith('.py'):
                yield os.path.join(path, f)
# Found here: 
# https://stackoverflow.com/questions/3137731/is-this-correct-way-to-import-python-scripts-residing-in-arbitrary-folders
def import_from_absolute_path(fullpath, global_name=None):
    script_dir, filename = os.path.split(fullpath)
    script, ext = os.path.splitext(filename)

    sys.path.insert(0, script_dir)
    try:
        module = __import__(script)
        if global_name is None:
            global_name = script
        globals()[global_name] = module
        sys.modules[global_name] = module
    except ModuleNotFoundError as mnf:
        print(mnf)
    except ImportError as ie:
        print(ie)
    except FileNotFoundError as fnf:
        print(fnf)
    finally:
        del sys.path[0]
“这些脚本是用于模拟的不同启动脚本和生成器。它们都继承自少数基类中的一个。如果需要,可以更改基类。因此,我正在寻找一种方法来收集继承自特定基类的所有脚本,以提供特定脚本的选择。”

我当前用于抓取目录并导入所有*.py文件的代码:

def all_files(directory):
    for path, dirs, files in os.walk(directory):
        for f in files:
            if f.endswith('.py'):
                yield os.path.join(path, f)
# Found here: 
# https://stackoverflow.com/questions/3137731/is-this-correct-way-to-import-python-scripts-residing-in-arbitrary-folders
def import_from_absolute_path(fullpath, global_name=None):
    script_dir, filename = os.path.split(fullpath)
    script, ext = os.path.splitext(filename)

    sys.path.insert(0, script_dir)
    try:
        module = __import__(script)
        if global_name is None:
            global_name = script
        globals()[global_name] = module
        sys.modules[global_name] = module
    except ModuleNotFoundError as mnf:
        print(mnf)
    except ImportError as ie:
        print(ie)
    except FileNotFoundError as fnf:
        print(fnf)
    finally:
        del sys.path[0]

为什么不是一个包裹?你需要这个做什么?请给出更多的问题背景,否则我们可以解决一个问题,你将不得不导入(加载)每一个…现在还不清楚为什么会“痛苦地”缓慢。如果您向我们展示您的代码,这很可能会加快速度。无论如何,更重要的问题是“为什么?”——你想通过这样做来实现什么,你认为什么是“体面的”方式?1。代码:请参见编辑2。为什么?:因为这些脚本使用的基类(可以更改,我指的是基类)部分不同,所以我正在寻找一种方法来动态地对它们进行分组,以便用户只能选择实现特定基类3的脚本。体面的方式?:我的意思是:“是否有一种我不知道的‘默认’方式来处理这个问题?如果没有,你对我如何处理这个问题有什么建议吗?”为什么它不是一个包?你需要这个做什么?请给出更多的问题背景,否则我们可以解决一个问题,你将不得不导入(加载)每一个…现在还不清楚为什么会“痛苦地”缓慢。如果您向我们展示您的代码,这很可能会加快速度。无论如何,更重要的问题是“为什么?”——你想通过这样做来实现什么,你认为什么是“体面的”方式?1。代码:请参见编辑2。为什么?:因为这些脚本使用的基类(可以更改,我指的是基类)部分不同,所以我正在寻找一种方法来动态地对它们进行分组,以便用户只能选择实现特定基类3的脚本。体面的方式?:我的意思是:“有没有一种我不知道的‘默认’方式来处理这个问题?如果没有,你对我如何处理这个问题有什么建议?”