python 中 '__init__.py' 文件的作用
前言
最近面试腾讯侧开实习生,挂了。不过找实习还得继续不是。这次面试问到个python的知识点,python 中 __init__.py
文件的作用。现场答得不够好。经过学习后,在这里总结下。
理论
在
python
中。每个.py
文件都是一个模块。把功能相近的几个模块放在同一个文件夹里,然后再加上名为__init__.py
的空文件,一个简易的python
包就创建好了。创建好包之后,就可以按照正常的
import package
逻辑调用包了。具体见下面的测试部分。假设此时你想要在import
这个包之后,自动的执行一些操作。这些操作写在__init__.py
中就可以了。我们在引用包时,经常为了方便起见,直接使用
from package import *
来一次性地导入package
中的所有模块。这个时候就需要用到__init__.py
中的另一个作用了。在__init__.py
中添加一个属性__all__
,这个属性是一个列表,包含了在导入当前包时,所有需要自动导入的模块。
测试
实际验证下刚刚所说的三个作用。
这里创建一个测试环境,整体的目录结构如下:
可以看到这里定义了一个两个模块mod.py
和test.py
。mod.py
处于package
文件夹内,现在先假装package
是一个python
包。
mod.py
和test.py
中的内容分别如下:
测试第一个作用
在没有加入__init__.py
文件时,运行test.py
文件,运行出错:
在package
文件夹中加入__init__.py
空文件,再次运行test.py
文件,正确运行:
但是这个时候你如果直接调用package.mod.m()
,还是会报错:
此时可通过两种方法解决这个问题:
1. 在__init__.py
中加入import mod
正确运行:
- 改变调用的方式,改
import package
为from package import mod
正确运行:
测试第二个作用
其实在第一个测试中已经用到了这个作用。就是刚刚所用到的解决直接调用package.mod.m()
报错问题的第一个方法。
这里再简单演示下:
可以看到执行import package
时自动执行了__init__.py
中的print
语句。
测试第三个作用
首先清空__init__.py
文件,这里刚刚添加的print
语句并步影响结果。清空只是为了突出问题。
直接运行test.py
:
可以看到运行出错了。这里出错是因为没有在__init__.py
中加入__all__
属性。
添加一下:
正确运行:
总结
本文到这里也就基本结束了。三个作用总结一下:
- 标识一个文件夹为
python
包 - 添加导入时自动运行的语句
- 通过添加
__all__
属性,增加对from package import mod
语句的支持
好了,本文到此结束。祝大家面试成功,也祝我面试成功。