执行位于文件夹中的 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
) 将不会注意到这些更改并继续以通常的方式调用模块。
我目前的文件夹结构如下:
.
├── 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
) 将不会注意到这些更改并继续以通常的方式调用模块。