我目前有一个像这样的文件夹结构:
.
├── 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()
,让这个程序运行。
答案 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()