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

时间:2015-02-08 01:46:24

标签: python scripting

我目前有一个像这样的文件夹结构:

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

每个subclass es都是parent的子类,而parent是一个抽象类。子类需要执行一些函数,如mix()meld(),并且每个子类都必须实现mix()meld()

我想编写main.py,以便执行每个子类中的函数,而不必将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文件夹中,只定义mix()meld(),让这个程序运行。

2 个答案:

答案 0 :(得分:1)

我从来没有尝试过这个,但我认为它做了你所要求的:

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)将对这些更改保持不知情并继续以通常的方式调用模块。

答案 1 :(得分:0)

尝试从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()