Python导入模块函数

时间:2018-01-31 07:35:13

标签: python c++

我有一个与Python文件管理相关的问题。我如何组织我的Python文件的方式如下(__init__.py为空):

--src
   |---__init__.py
   |---module1
   |     |----- __init__.py
   |     |----- my_file1.py
   |---module2
   |     |----- __init__.py
   |     |----- my_file2.py
--app
   |---my_application.py

如您所见,我将代码分为两组:第一组代码位于src目录中,包含自定义库代码;第二组代码位于app目录中,包含将调用自定义库的应用程序代码。 my_application.py可能包含以下代码:

  from src.module1.my_file1 import ClassA1, ClassA2, ClassA3
  from src.module2.my_file2 import ClassB1, ClassB2, ClassB3
  a = ClassA1()
  b = ClassB3()

每当我编写基于它的应用程序时,从自定义库中导入类是很无聊的。我想有类似的东西:

  • 请求1:

      

    导入src.module1

    中定义的所有类
  • 请求2:

      

    导入src.module1和src.module2

    中定义的基本类

    此处基本类可以引用ClassA1中的src.module1.my_file1ClassB2中的src.module2.my_file2

在C ++中,这很容易实现。例如,对于第二个要求,我可以将所有与基本类相关的头文件放在一个头文件中。然后在应用程序中,我只包含这个头文件。但我不知道Python如何工作。谢谢。

2 个答案:

答案 0 :(得分:1)

要回答您的第一个问题,您只需将from src.module1.my_file1 import ClassA1, ClassA2, ClassA3替换为import src.module.my_file1

即可

这将允许您访问模块中的所有类。如果需要,您还可以将导入的模块命名为import module as md,这样您就可以访问模块中的所有类,如a = md.ClassA1()

关于你的第二个问题,我认为不需要只从模块中导入一些类。除非被调用,否则这些类不会被实例化,因此不会为它们分配任何内存。

答案 1 :(得分:0)

答案基于@ Xatyrian的评论在Python中使用__all__关键字购买(Stackoverflow的讨论可以在这里找到,@Aaron Hall的评论非常好)

  

请求1:导入src.module1

中定义的所有类

请在本次讨论中查看@Marshal Hayes的回答。基本上,我们将使用import module_name

导入模块
  

请求2:导入src.module1和src.module2中定义的基本类

可以使用关键字__all__来完成此操作。

 --src
   |---__init__.py             (1)
   |---module1
   |     |----- __init__.py    (2)
   |     |----- my_file1.py
   |---module2
   |     |----- __init__.py    (3)
   |     |----- my_file2.py
--app
   |---my_application.py

在(1)__init__.py中,我们可以表示我们要导出的模块(如果我们要从此模块导出函数,则导出模块)。在(2)和(3)中,我们表示要导出的文件(如果我们要从此文件导出函数,则导出文件)。然后在每个函数实现文件中,例如my_file1.py,我们可以列出我们要在__all__=[fun1,fun2,fun3]关键字中导出的所有函数。

然后,当我们想在应用程序文件中使用导出的函数时,我们只需导入顶层模块名称。在我们的示例中,我们将执行以下操作:

import src
src.fun1()
src.fun2()
print(dir(src)) : list all functions and modules in this package