2017-10-09 148 views
0

我们有我们试图保持对组织的目的单独的文件/模块,如果我们整合所有这些到一个文件中,将创建一个怪物的文件,将几个不同的模块很难导航。但是我们希望能够将它们导入到一个模块中,我们可以调用所有相关的函数,以便在脚本中使用它。创建一个Python模块从几个不同的模块

由于我们所要完成的例子。

我们是在结构文件的n个:

# module1.py 
class Module1(): 
    def __init__(self, file): 
     self.file = load.file 

    def get_item_from_file(): 
     return self.file['path']['to']['item'] 

我们希望有一个具有

# all_modules.py 
from module1 import Module1 
from moduleN import ModuleN 

class AllModules(): 
     def __init__(self,file): 
      self.file = load.file 
      # Some magic to instantiate all the functions in Module1-N 
      # so they can be instantiated by making an AllModules object 

换句话说,我们希望能够使用一个单一的文件上面的模块如下

#Somescript.py 
from all_modules import AllModules 
file = some_file_input 
test = AllModules(file) 
item_in_file = test.get_item_from_file() 

任何意见,将不胜感激,因为我们对这种类型很新o f模块工作。我们希望确保我们正在以pythonic的方式进行,而不是一起黑客攻击。

+0

它看起来像你从Java中来。类和模块是完全不同的东西,了解其差异很重要。 – user2357112

+0

我不是来自Java,但是我的术语可能会关闭。理论上我们可以在每个module1.py文件中有几个类。我只是试图保持简单的例子。如果通过改变我们的结构来解决问题,我会感兴趣 – user1691282

+1

为什么一个班级的所有东西都是?你为什么要创建一个类来结合一堆其他类的函数呢?我感觉到你将会得到一些可怕的多重继承怪物,因为它不应该定义任何类。看起来你应该编写模块级功能。 – user2357112

回答

0

只要你不在乎,你不这样做“从MODULEX进口MODULEX”语句,你可以做基于字符串的进口。

import importlib 

def my_import(name): 
    components = name.split('.') 
    mod = __import__(components[0]) 
    for comp in components[1:]: 
     mod = getattr(mod, comp) 
    return mod 

imports = [] 
for root, dirs, files in os.walk(rootdir): 
    for f in files: 
     if f.startswith("module"): 
      # find module number magic. 
      imports.apppend(my_import(f.replace('.py', '') + ".module" + str(modulenumber)) 

然后,通过

class_instance = imports[i]() 

引用模块此代码是不完全充分的测试,但在动态文件导入字符串特定类的记录方式。