7. 动态导入所有子类

经常存在某目录下的所有文件都继承某个子类,动态导入所有子类,原理就是按子类名称与子类以键值的形式存在globals()中,使用的时候直接取,好好思考下The Zen of Python中提到的最后一条:Namespaces are one honking great idea

def enumerate_plugins(dirpath, class_):
    """import modules dynamicly"""
    for _, name, _ in pkgutil.iter_modules([dirpath]):
        try:
            importlib.import_module(dirpath + '.' + name)
        except ImportError:
            raise ImportError
        else:
            subclass = class_.__subclasses__()[-1]
            globals()[subclass.__name__] = subclass

enumerate_plugins('dir_path', BaseClass)

构造器有相关namespace的骚操作

class A:
    def __init__(self,a,b,c,d,e):
        self.__dict__.update({k: v for k, v in locals().items if k != 'self'})