python模块 init py_关于模块:为什么python需要包的__init__.py?

本问题已经有最佳答案,请猛点这里访问。

我知道python需要__ init __.py文件才能将目录识别为python包,这样我们就可以将子模块导入到我们的程序中。我可以看到类的相似性以及init如何被用来执行必要的代码。

但是,在python文档中,这一行让我很困惑,

This is done to prevent directories with a common name, such as

string, from unintentionally hiding valid modules that occur later on

the module search path.

如图所示:https://docs.python.org/2/tutorial/modules.html包

有人能解释一下吗?

您专门链接到python 2,但是您可能对不能包含__init__.py的python 3名称空间包感兴趣。见python.org/dev/peps/pep-0420

文档对此非常清楚-您的项目结构可能如下所示:

app

- common

- init.py

- resources

- string

- src

如果python将目录隐式地视为包,则"string"目录可能会出现与python内置的字符串模块(https://docs.python.org/2/library/string.html)名称冲突的情况。这意味着当调用import string时,模块是不明确的。

__init__.py还增加了一些功能:初始化包时执行的代码,因此可以用于进行某种类型的包设置。

太棒了,谢谢

this is done to prevent directories with a common name, such as string, from unintentionally hiding valid modules that occur later on the module search path.

假设您有一个为学校工作的目录,其中一些涉及到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/视为包数学;在不知道原因的情况下破坏代码。

如果您有一个名为string的目录,而该目录不是包,那么在Python搜索模块和包(如当前工作目录)的位置,在执行import string操作时,Python不应尝试导入该目录。__init__.py要求让python知道它应该继续运行,而不是将该目录视为一个包。

谢谢,这很有道理。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值