执行位于文件夹中的 python class 代码

Executing python class code located in folders

我目前的文件夹结构如下:

.
├── main.py
└── parent.py
└── classes
    └── subclass1.py
    └── subclass2.py
    └── subclass3.py

每个 subclass 都是 parent 的子class,父是抽象 class。 subclasses 需要执行一些函数,比如 mix()meld(),并且每个 subclasses 都必须实现 mix()meld() .

我想编写 main.py 以便执行每个子 class 中的函数,而无需将它们的文件 import 放入我的程序中。也就是说,我希望发生类似于以下情况的事情:

def main():
    # Note that I don't care about the order of which these
    for each subclass in the sources folder:
        execute `mix()` and `meld()`
        # Note that I don't mind which order the order 
        # of which the subclasses' functions are invoked.

有什么方法可以实现这一点吗?

本质上,我想做的是将一堆 classes 放入 classes 文件夹中,只定义了 mix()meld(),然后让这个程序 运行 野.

尝试从 main.py 程序文件中的子文件夹导入:

from glob import *
import os

for i in glob.glob(os.path.join('classes', '*.py')):
    __import__(i); className = i[:-3].capitalize()
    eval(className).mix(); eval(className).meld()

我从未尝试过,但我认为它可以满足您的要求:

import os
import imp
import runpy

package = 'classes'

_, path, _ = imp.find_module(package)
for m in os.listdir(path):
    if m.endswith('.py'):
        runpy.run_module(
            package + '.' + os.path.splitext(m)[0], 
            run_name="Mix_Meld"
        )

然后,在你的子类中,你可以写:

if __name__ == 'Mix_Meld':
    ClassName.mix()
    ClassName.meld()

当然,这可能会产生额外的代码,但如果您需要停止其中一个文件的执行,只需注释掉那部分代码即可。

另一个优点是可扩展性和多态性;如果您将来需要 运行 这些模块中的每一个的代码略有不同,您只需更改特定模块中的行为。被调用者 (main.py) 将不会注意到这些更改并继续以通常的方式调用模块。