C'est une méthode de stockage de Plugin, etc. dans un certain répertoire et d'import de tous les fichiers * .py dans ce répertoire sans spécifier de fichiers individuels dans le code.
Supposons la structure de répertoires suivante.
./loader.py
./plugins
./plugins/__init__.py
./plugins/a.py
./plugins/b.py
__init __. py est vide et OK. ʻA.pyetb.py` sont comme ça pour le moment.
a.py
#!/usr/bin/env python
# coding: utf-8
class Plugin1:
    ''' plugin1 '''
class Plugin2:
    ''' plugin2 '''
b.py
#!/usr/bin/env python
# coding: utf-8
class Plugin3:
    ''' plugin3 '''
Écrivez loader.py comme suit.
loader.py
#!/usr/bin/env python
# coding: utf-8
import os
import inspect
import importlib
import glob
def load_classes(dname):
    class_list = []
    # *.Charger py
    for fpath in glob.glob(os.path.join(dname, '*.py')):
        #Supprimer le séparateur d'extension et de chemin de fichier(Pour Unix'/')À'.'Remplacer par
        cpath = os.path.splitext(fpath)[0].replace(os.path.sep, '.')
        #Charger en tant que module
        mod = importlib.import_module(cpath)
        #Appelez la classe contenue dans le module chargé
        for cls_name, cls in inspect.getmembers(mod, inspect.isclass):
            # (Nom de classe avec chemin du répertoire,Corps de classe)Stocké au format
            class_list.append(('{0}.{1}'.format(cpath, cls_name), cls))
    return class_list
        
import pprint
clist = load_classes('plugins')
pprint.pprint(clist)
Le résultat de l'exécution est le suivant.
$ ./loader.py
[('plugins.a.Plugin1', <class plugins.a.Plugin1 at 0x10d2538d8>),
 ('plugins.a.Plugin2', <class plugins.a.Plugin2 at 0x10d253940>),
 ('plugins.b.Plugin3', <class plugins.b.Plugin3 at 0x10d2539a8>)]
Le deuxième élément de la liste est le corps de la classe, que vous pouvez utiliser pour créer une instance.
c = clist[0][1]()
print c
# <plugins.a.Plugin1 instance at 0x107195d40>
Recommended Posts