每个python包都需要__init__.py吗? [python 3.3+以来的新功能]

时间:2017-12-10 11:49:13

标签: python python-3.6

我在python教程中看到了这个:

  

需要__init__.py文件才能使Python将目录视为包含包;

我在pycharm中创建了这样的目录层次结构,其中subdir1不包含__init__.py,而subdir2包含__init__.py文件。 enter image description here

首先,我将Directory添加到system.pyth中。

我分别在hello1.py和hello2.py中写了一个hello函数。

然后我在这样的测试文件中调用hello func:

# test1.py
from subdir1 import hello1
hello1.hello()

# test2.py
from subdir2 import hello2
hello2.hello()

他们都成功了。对于来自不同目录的导入模块,似乎不需要__init__.py,对吧?

所以,我想知道在什么情况下需要__init__.py。谢谢你的回答!

3 个答案:

答案 0 :(得分:5)

Python 3.3+具有隐式命名空间包,允许您创建没有__init__.py的包。在Python 2中,__init__.py是旧方法,仍然有效。

  

允许隐式命名空间包意味着可以完全删除提供 __ init __。py 文件的要求,并且可以将受影响的部分安装到公共目录中,或者在分布看起来合适时拆分多个目录。

注意: init .py文件用于将磁盘上的目录标记为Python包。

有用的链接:

  1. Implicit Namespace Packages

答案 1 :(得分:0)

__init__.py

当我们退出解释器时,Python解释器中的所有代码都将丢失。但是在编写大型程序时,文件被分成多个不同的文件,以便于使用,调试和可读性。在Python中,模块用于实现这些目标。模块只是带有Python定义和语句的文件。要导入的模块名称与没有.py扩展名的Python文件的名称相同。

因此,如果您希望某个目录下的文件是一个模块,并且您希望它是一个可导出的模块,那么该类别需要具有 init < /strong>.py

More details

答案 2 :(得分:0)

使Python将目录视为package

Python Doc