Python中常见的__init__.py是什么意思?详解Python import的方式和原理

  • 1 什么是模块化编程?
  • 2 __init__.py文件的作用
  • 3 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

此方式相当于打开一个名为subpackage1的文件夹,再将其中的模块moduleA复制粘贴到当前空白文件夹下,引用moduleAfun1()需要moduleA.fun1()。这种方式下,还有from subpackage1 import *的句式可以引入包中的所有模块。

  • from subpackage.moduleA import fun1()

此方式相当于打开一个名为subpackage1的文件夹下的模块moduleA,再将其中的fun1()复制粘贴到当前空白文件夹,引用fun1()只需fun1()即可。

除了应用上述导入句式外,还需要注意当前文件的运行路径,如下所示为一个忽略路径因素造成的导入包报错,因为运行目录app\pkg_2\下没有文件pkg_1且环境变量中也不存在pkg_1

app|- pkg_1|- __init__.py|- moduleA.py    # fun1()|- pkg_2|- __init__.py|- test.py# test.py中引用
# from pkg_1.moduleA import fun1
# 执行如下
>>> python app\pkg_2\test.py
>>> from pkg_1.moduleA import fun1
ModuleNotFoundError: No module named 'pkg_1'

若需要保持运行目录不变,必须进行环境变量配置,在import pkg_1前先添加父级目录到python解释器的运行环境变量中,在pkg_2的父级目录app下可访问到pkg_1,具体实现上依赖于sysos

import sys, os
sys.path.append(os.path.realpath('..'))

综上所述,包的导入需要考虑两个因素:

  1. 从哪里导入,即运行路径和环境变量的配置问题;

  2. 如何导入,即使用何种import句式。


Python中常见的__init__.py是什么意思?详解Python import的方式和原理相关推荐

  1. python中文件打开的合法模式组合_详解python中各种文件打开模式

    在python中,总的来说有三种大的模式打开文件,分别是:a, w, r 当以a模式打开时,只能写文件,而且是在文件末尾添加内容. 当以a+模式打开时,可以写文件,也可读文件,可是在读文件的时候,会发 ...

  2. python中 a or b 的值为_详解python中and和or的返回值

    在Python 中,and 和 or 执行布尔逻辑演算,如你所期待的一样,但是它们并不返回布尔值:而是,返回它们实际进行比较的值之一. 一.and:>>> 'a' and 'b' ' ...

  3. python中的str方法和repr方法_详解Python中__str__和__repr__方法的区别

    对我当前工程进行全部测试需要花费不少时间.既然有 26 GB 空闲内存,为何不让其发挥余热呢? tmpfs 可以通过把文件系统保存在大内存中来加速测试的执行效率. 但优点也是缺点,tmpfs 只把结果 ...

  4. python os模块安装方法_基于python中pygame模块的Linux下安装过程(详解)

    一.使用pip安装Python包 大多数较新的Python版本都自带pip,因此首先可检查系统是否已经安装了pip.在Python3中,pip有时被称为pip3. 1.在Linux和OS X系统中检查 ...

  5. python数组相减_对Python 中矩阵或者数组相减的法则详解

    对Python 中矩阵或者数组相减的法则详解 最近在做编程练习,发现有些结果的值与答案相差较大,通过分析比较得出结论,大概过程如下: 定义了一个计算损失的函数: def error(yhat,labe ...

  6. python中requests库的用途-python中requests库session对象的妙用详解

    在进行接口测试的时候,我们会调用多个接口发出多个请求,在这些请求中有时候需要保持一些共用的数据,例如cookies信息. 妙用1 requests库的session对象能够帮我们跨请求保持某些参数,也 ...

  7. Python中第三方库Requests库的高级用法详解

    Python中第三方库Requests库的高级用法详解 虽然Python的标准库中urllib2模块已经包含了平常我们使用的大多数功能,但是它的API使用起来让人实在感觉不好.它已经不适合现在的时代, ...

  8. 站长在线Python精讲:在Python中使用正则表达式的sub()方法替换字符串详解

    欢迎你来到站长在线的站长学堂学习Python知识,本文学习的是<在Python中使用正则表达式的sub()方法替换字符串详解>. 在Python中使用正则表达式的sub()方法替换字符串. ...

  9. 站长在线Python精讲:在Python中使用正则表达式的split()方法分割字符串详解

    欢迎你来到站长在线的站长学堂学习Python知识,本文学习的是<在Python中使用正则表达式的split()方法分割字符串详解>. 使用正则表达式分割字符串 在Python中使用正则表达 ...

最新文章

  1. react 显示当前时间_react中monent如何获取日期?
  2. python在会计工作中的应用-python有什么用(会计专业)
  3. 软件缘-网友个人精心打造的精品软件收集
  4. Android中的线性布局
  5. 如果服务器开机显示NObootable,电脑不能开机提示No bootable device怎么办?
  6. 外星人入侵 python 飞船位置_《python从入门到实践》项目一:外星人入侵
  7. atitit.jQuery Validate验证框架详解与ati Validate 设计新特性
  8. caffe2:conda路径和权限问题
  9. 多元高斯分布(Multivariate Gaussian Distribution)
  10. LeetCode 1271. 十六进制魔术数字(进制转换)
  11. python2版本异常_Python to.exe引发异常:此项目的版本控制需要sdisttarb
  12. 一个java中HashMap和HashSet的应用实例
  13. Linux信号实践(5) --时间与定时器
  14. 电脑有线网络和无线网络共用
  15. Linux about MySQL
  16. 孙鑫视频VC++深入详解学习笔记
  17. 腾讯、阿里也开始裁员了,失业来得太突然…
  18. 实战 Java 第8天:开发商品详情查询接口
  19. vue高德地图绘制行政区边界
  20. 用C语言将整数翻译为英文,C语言实现翻译功能

热门文章

  1. 春运火车上的这10种人,有一个就是你!
  2. 论文笔记--Exploring Translation Similarities for Building a Better Sentence Aligner
  3. 研究100位同行,我总结了从0到5年的新媒体晋级宝典
  4. excel两个表格内容合并
  5. CSDN每日一练:蛇形矩阵
  6. [论文翻译]数据集的domian问题:Intramodality Domain Adaptation Using Self Ensembling and Adversarial Training
  7. 2020年9月指数定期审核与调整 | TokenInsight
  8. Java实现首字母大写
  9. 读书笔记:司马迁《史记》之孝文本纪
  10. LTE语音业务-VOLTE(一)