在python文件之间共享代码

时间:2016-08-16 17:19:50

标签: python python-3.x python-import

假设我有以下文件:

-- classes.py
-- main.py
-- commands.py
-- output.py

main.py是主文件,它使用classescommandsoutput中的代码。 commandsclasses中定义的对象作为功能输入并访问这些对象的方法/属性。 commandsclasses都使用output中定义的函数。

问题:我是否需要在每个依赖它们的文件中导入这些模块? 即:我是否需要在outputclassescommands中导入main?或classesoutputcommands全部导入main的事实是否意味着他们不需要单独导入?

处理具有相互依赖关系的多个文件的最佳做法是什么?

1 个答案:

答案 0 :(得分:2)

  

问题:我是否需要在每个模块中导入这些模块中的每一个   依赖于它们的文件?即:我是否需要在两者中导入输出   class,commands和main?

是的,这是要走的路。

  

或者类,输出和命令都是全部导入的   主要意味着他们不需要单独进口?

没有

Python文件是模块。 python模块有一个符号表。模块中指定的每个函数,类和变量都在此表中。模块只能使用此表中的内容以及Python内置函数。

例如classes.py

def function(): pass
class Class(object): pass

有符号表:

{
    'function': function,
    'Class': Class
}

您只能在function内使用Classclasses.py(加上提到的内置版)。你不能隐式地访问这个模块之外的任何东西,Python没有任何像C#和Java那样的命名空间概念。如果您需要来自不同文件(模块)的任何内容,则必须明确导入它。

现在“导入”时会发生什么?

非常简单 - 导入的模块“成为”模块本身的一部分!

在下一个示例中,我们有output.py

def output_function(): pass

带符号表:

{
    'output_function': output_function
}

classes.py

import output
from output import output_function

def function(): pass
class Class(object): pass

带符号表:

{
    'Class': Class,
    'function': function,
    'output': {
        'output_function': output_function
    }
    'output_function': output_function
}

其中'output'的值实际上是'output'的符号表(同一个对象)!

你甚至可以在另一个模块中进行:

import classes

classes.output.output_function()

但不要,明确说明您的导入。

听起来有点奇怪,但这就是Python的工作方式。请注意,还有更多内容,例如第一次导入模块时执行等等...