假设我有以下文件:
-- classes.py
-- main.py
-- commands.py
-- output.py
main.py
是主文件,它使用classes
,commands
和output
中的代码。 commands
将classes
中定义的对象作为功能输入并访问这些对象的方法/属性。 commands
和classes
都使用output
中定义的函数。
问题:我是否需要在每个依赖它们的文件中导入这些模块?
即:我是否需要在output
,classes
和commands
中导入main
?或classes
,output
和commands
全部导入main
的事实是否意味着他们不需要单独导入?
处理具有相互依赖关系的多个文件的最佳做法是什么?
答案 0 :(得分:2)
问题:我是否需要在每个模块中导入这些模块中的每一个 依赖于它们的文件?即:我是否需要在两者中导入输出 class,commands和main?
是的,这是要走的路。
或者类,输出和命令都是全部导入的 主要意味着他们不需要单独进口?
没有
Python文件是模块。 python模块有一个符号表。模块中指定的每个函数,类和变量都在此表中。模块只能使用此表中的内容以及Python内置函数。
例如classes.py
:
def function(): pass
class Class(object): pass
有符号表:
{
'function': function,
'Class': Class
}
您只能在function
内使用Class
和classes.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的工作方式。请注意,还有更多内容,例如第一次导入模块时执行等等...