从子文件夹中的文件动态导入同名 类

Dynamically importing identically named classes from files in subfolder

我需要从子文件夹中的文件中动态导入同名的 classes。 classes 在每个文件中都有不同的实现。导入后,我需要为每个 class 创建一个实例并将它们存储在数据结构中,这样我就可以在这些实例中调用每个函数。

文件夹结构:

./main.py
./players/player1.py
./players/player2.py
./players/player3.py
./players/player4.py

player1.py

class PlayerClass():
    def doStuff():
        stuff implementation 1

player2.py

class PlayerClass():
    def doStuff():
        stuff implementation 2

因此 main.py 将从这些文件中导入所有 PlayerClasses 并为每个创建一个实例,然后能够从每个实例调用 doStuff 等函数。 类似于:

importedClasses[0].doStuff()

我已经设法提取文件名,但我无法从子文件夹导入,我也无法将它们作为唯一对象导入并将它们存储在列表或类似列表中。

这是一种方法

from glob import glob
from importlib.machinery import SourceFileLoader

modules = sorted(glob('players/player*.py'))

imported_classes = list(map(lambda pathname: SourceFileLoader(".", pathname).load_module().PlayerClass(), modules))

imported_classes[0].doStuff()

这里我们使用glob to match the pathnames to the modules we would like to import. Then import them using the importlib module (SourceFileLoader).