我知道python需要__ init __.py
文件才能将目录识别为python包,这样我们就可以将子模块导入到我们的程序中。我可以看到类与类的相似性以及如何使用init执行必要的代码。
然而,在python文档中,这一行让我困惑,
这样做是为了防止具有通用名称的目录,例如 字符串,无意中隐藏了稍后出现的有效模块 模块搜索路径。
如此处所见https://docs.python.org/2/tutorial/modules.html#packages
请有人澄清一下吗?
答案 0 :(得分:5)
文档非常明确 - 您的项目结构可能如下所示:
app
- common
- init.py
- resources
- string
- src
如果Python隐式将目录视为包,则“string”目录可能会与Python的内置字符串模块(https://docs.python.org/2/library/string.html)呈现名称冲突。这意味着在调用import string
时,模块不明确。
__init__.py
还增加了一些功能:初始化包时会执行代码,因此可以用来进行某种类型的包设置。
答案 1 :(得分:3)
如果你有一个名为string
的目录不是一个包,那么在Python搜索模块和包(例如当前工作目录)的位置,Python就不应该'当你import string
时尝试导入它。 __init__.py
要求允许Python知道它应该继续运行而不是将该目录视为包。
答案 2 :(得分:3)
这样做是为了防止具有通用名称的目录(例如字符串)无意中隐藏稍后在模块搜索路径上出现的有效模块。
假设你有一个你在学校工作的目录,其中一些涉及python。你有一个数学目录,你称之为数学。您还有一个您编写的python模块,因此顶级目录“school”已添加到python路径中,因此您可以在任何地方使用它
School/
math/
hw1.txt
integrate.py
MyPythonModule/
__init__.py
someClass.py
someFunc.py
当您以后使用python并且正在搜索MyPythonModule时,python将打开School/
然后它会看到math/
和MyPythonModule/
如果你在python程序中使用math,并且没有办法区分模块../lib/site-packages/math/
和非模块../School/math/
,那么python会将你的文件../School/math/
视为包数学;在你不知道原因的情况下打破代码。