面试题答案
一键面试__init__.py
文件的作用
- 标识包的存在:在Python 2中,一个目录若要被视为一个包,必须包含
__init__.py
文件,哪怕该文件为空。在Python 3.3及之后的版本,这个文件不再是必需的,但保留它仍然是一种好的实践方式。它告诉Python这个目录是一个Python包,从而可以使用包相关的导入机制。 - 执行包初始化代码:当包被导入时,
__init__.py
文件中的代码会被执行。例如,可以在__init__.py
中定义包级别的变量、导入子模块等。 - 控制包的导入行为:可以在
__init__.py
中使用__all__
变量来控制from package import *
这种导入方式导入的模块。比如,在package/__init__.py
中定义__all__ = ['module1','module2']
,那么from package import *
就只会导入module1
和module2
模块。
Python 2和Python 3中使用差异
- 必要性:
- Python 2:必须要有
__init__.py
文件,目录才能被当作包。例如,有一个目录结构my_package/
,若要将其作为包使用,必须在my_package/
目录下创建__init__.py
文件。 - Python 3.3+:
__init__.py
文件不再是必需的,即使没有该文件,目录也可被识别为包。例如,同样的my_package/
目录,在Python 3.3及以上版本中,即使没有__init__.py
,也能以包的方式导入模块,如from my_package import some_module
(前提是some_module
存在于my_package
目录下)。
- Python 2:必须要有
- 默认导入行为:
- Python 2:在
__init__.py
中不定义__all__
时,from package import *
不会导入所有子模块,需要显式地导入每个子模块。例如,包package
下有module1.py
和module2.py
,在package/__init__.py
为空时,from package import *
不会导入module1
和module2
,需要在__init__.py
中写from. import module1
from. import module2
才能通过from package import *
导入。 - Python 3:行为与Python 2类似,但在Python 3中,对于隐式命名空间包(无
__init__.py
文件的包),from package import *
更是遵循“不导入所有”的原则,因为隐式命名空间包没有__init__.py
来定义__all__
。
- Python 2:在