Python中常见的__init__.py是什么意思?详解Python import的方式和原理
1 什么是模块化编程?
工程模块化是指将具有一定共性的功能封装成一个模块,并对外暴露应用接口,方便其他工程直接调用而无需关注底层实现的思想,工程模块化可以避免工程中各种功能函数相互交杂、定义混乱不堪的情形,有助于提高系统可维护性。
在C/C++中,工程模块化的基础是函数头文件.h,其是专门存放函数声明的文件,这些函数声明的具体实现则分离到函数源文件.cpp或.c中,若干个头文件和源文件组成一个模块。
在Python中,工程模块化的基础则是 __init__.py文件
2 init.py文件的作用
__init__.py
文件有如下作用:
- 组织包,是Package的标识文件
# 目录结构
app
|- pkg_1
|- __init__.py
|- moduleA.py # fun1()
|- moduleB.py
|- pkg_2
|- __init__.py
|- test.py
# pkg\_1 \_\_init\_\_.py
from pkg_1 import moduleA
# test.py中引用
import pkg_1
pkg_1.moduleA.fun1() # 运行成功
# 删除\_\_init\_\_.py运行失败
没有__init__.py
就无法导入包
- 在__init__.py中定义__all__列表控制着包的导入行为
这里解释模糊导入的概念。模糊导入的句式为:from pkg import *
*为通配符,即导入包中的所有模块。若希望为包中的模块设置访问权限,即在模糊导入作用下选择性地引入模块,则需要在__init__.py
中定义__all__
列表。例如上例中,在pkg_1->__init__.py
中定义__all__=["moduleA"]
,则在模糊导入时只引入模块moduleA而不会导入moduleB。因此__all__
的作用是:在模块级别暴露接口,提供了公开(Public)接口的约定。
- 在__init__.py中导入其他包或模块,方便组织管理各个模块之间的引用
3 Python如何import第三方库
前面说到,Python包以__init__.py为标志,用于实现工程模块化,假设包组织结构的实例如下:
package
|- subpackage1
|- __init__.py
|- moduleA.py #fun1() fun2()
|- subpackage2
|- __init__.py
|- moduleA.py #fun1()
|- moduleB.py #fun3() fun4()
用虚拟文件夹的方式理解Python包。所有的包都可视作文件夹,其下包含模块或子包(子文件夹),模块中包含函数、类、变量等属性。当前路径位置可视作一个空白文件夹,关键字from理解为“打开”,关键字import理解为“导入”,必须指出:所有import相关操作都要落实到模块或属性。一般地,导入有如下方式:
- import subpackage1.moduleA
此方式相当于把一个名为subpackage1
的文件夹复制粘贴到当前路径下,文件夹只包含模块moduleA
,即使subpackage1
中可能还有其他模块,引用moduleA
中的func1()
需要subpackage1.moduleA.fun1()
,即打开subpackage1
文件夹,再使用模块moduleA
中的属性fun1()
。注意,如果仅import subpackage1
,相当于只引入了一个空文件夹,此时无法调用fun1()
,除非在__init__.py
中提前导入了模块。
- from subpackage1 import moduleA
文末有福利领取哦~
👉一、Python所有方向的学习路线
Python所有方向的技术点做的整理,形成各个领域的知识点汇总,它的用处就在于,你可以按照上面的知识点去找对应的学习资源,保证自己学得较为全面。
👉二、Python必备开发工具
👉三、Python视频合集
观看零基础学习视频,看视频学习是最快捷也是最有效果的方式,跟着视频中老师的思路,从基础到深入,还是很容易入门的。
👉 四、实战案例
光学理论是没用的,要学会跟着一起敲,要动手实操,才能将自己的所学运用到实际当中去,这时候可以搞点实战案例来学习。(文末领读者福利)
👉五、Python练习题
检查学习结果。
👉六、面试资料
我们学习Python必然是为了找到高薪的工作,下面这些面试题是来自阿里、腾讯、字节等一线互联网大厂最新的面试资料,并且有阿里大佬给出了权威的解答,刷完这一套面试资料相信大家都能找到满意的工作。
👉因篇幅有限,仅展示部分资料,这份完整版的Python全套学习资料已经上传
网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。
一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!