Python中__init__.py文件的作用详解


Posted in Python onSeptember 18, 2016

__init__.py 文件的作用是将文件夹变为一个Python模块,Python 中的每个模块的包中,都有__init__.py 文件。

通常__init__.py 文件为空,但是我们还可以为它增加其他的功能。我们在导入一个包时,实际上是导入了它的__init__.py文件。这样我们可以在__init__.py文件中批量导入我们所需要的模块,而不再需要一个一个的导入。

# package
# __init__.py
import re
import urllib
import sys
import os
# a.py
import package 
print(package.re, package.urllib, package.sys, package.os)

注意这里访问__init__.py文件中的引用文件,需要加上包名。

__init__.py中还有一个重要的变量,__all__, 它用来将模块全部导入。

# __init__.py
__all__ = ['os', 'sys', 're', 'urllib']
# a.py
from package import *

这时就会把注册在__init__.py文件中__all__列表中的模块和包导入到当前文件中来。

可以了解到,__init__.py主要控制包的导入行为。要想清楚理解__init__.py文件的作用,还需要详细了解一下import语句引用机制:

可以被import语句导入的对象是以下类型:

•模块文件(.py文件)

•C或C++扩展(已编译为共享库或DLL文件)

•包(包含多个模块)

•内建模块(使用C编写并已链接到Python解释器中)

当导入模块时,解释器按照sys.path列表中的目录顺序来查找导入文件。

import sys
>>> print(sys.path)
# Linux:
['', '/usr/local/lib/python3.4',
'/usr/local/lib/python3.4/plat-sunos5',
'/usr/local/lib/python3.4/lib-tk',
'/usr/local/lib/python3.4/lib-dynload',
'/usr/local/lib/python3.4/site-packages']
# Windows:
['', 'C:\\WINDOWS\\system32\\python34.zip', 'C:\\Documents and Settings\\weizhong', 'C:\\Python34\\DLLs', 'C:\\Python34\\lib', 'C:\\Python34\\lib\\plat-win', 'C:\\Python34\\lib\\lib-tk', 'C:\\Python34\\Lib\\site-packages\\pythonwin', 'C:\\Python34', 'C:\\Python34\\lib\\site-packages', 'C:\\Python34\\lib\\site-packages\\win32', 'C:\\Python34\\lib\\site-packages\\win32\\lib', 'C:\\Python34\\lib\\site-packages\\wx-2.6-msw-unicode']

其中list第一个元素空字符串代表当前目录。

关于.pyc 文件 与 .pyo 文件

.py文件的汇编,只有在import语句执行时进行,当.py文件第一次被导入时,它会被汇编为字节代码,并将字节码写入同名的.pyc文件中。后来每次导入操作都会直接执行.pyc 文件(当.py文件的修改时间发生改变,这样会生成新的.pyc文件),在解释器使用-O选项时,将使用同名的.pyo文件,这个文件去掉了断言(assert)、断行号以及其他调试信息,体积更小,运行更快。(使用-OO选项,生成的.pyo文件会忽略文档信息)

导入模块

模块通常为单独的.py文件,可以用import直接引用,可以作为模块的文件类型有.py、.pyo、.pyc、.pyd、.so、.dll

在导入模块时,解释器做以下工作:

1.已导入模块的名称创建新的命名空间,通过该命名空间就可以访问导入模块的属性和方法。

2.在新创建的命名空间中执行源代码文件。

3.创建一个名为源代码文件的对象,该对象引用模块的名字空间,这样就可以通过这个对象访问模块中的函数及变量

import 语句可以在程序的任何位置使用,你可以在程序中多次导入同一个模块,但模块中的代码仅仅在该模块被首次导入时执行。后面的import语句只是简单的创建一个到模块名字空间的引用而已。

sys.modules字典中保存着所有被导入模块的模块名到模块对象的映射。

导入包

多个相关联的模块组成一个包,以便于维护和使用,同时能有限的避免命名空间的冲突。一般来说,包的结构可以是这样的:

package
|- subpackage1
|- __init__.py
|- a.py
|- subpackage2
|- __init__.py
|- b.py

有以下几种导入方式:

import subpackage1.a # 将模块subpackage.a导入全局命名空间,例如访问a中属性时用subpackage1.a.attr
from subpackage1 import a # 将模块a导入全局命名空间,例如访问a中属性时用a.attr_a
from subpackage.a import attr_a # 将模块a的属性直接导入到命名空间中,例如访问a中属性时直接用attr_a 
使用from语句可以把模块直接导入当前命名空间,from语句并不引用导入对象的命名空间,而是将被导入对象直接引入当前命名空间。

以上所述是小编给大家介绍的Python中__init__.py文件的作用详解,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对三水点靠木网站的支持!

Python 相关文章推荐
Pycharm学习教程(6) Pycharm作为Vim编辑器使用
May 03 Python
[原创]Python入门教程1. 基本运算【四则运算、变量、math模块等】
Oct 28 Python
详解django中url路由配置及渲染方式
Feb 25 Python
如何利用Anaconda配置简单的Python环境
Jun 24 Python
PyQt5实现QLineEdit添加clicked信号的方法
Jun 25 Python
python自动化测试之DDT数据驱动的实现代码
Jul 23 Python
python快速编写单行注释多行注释的方法
Jul 31 Python
Python正则表达式急速入门(小结)
Dec 16 Python
使用Python串口实时显示数据并绘图的例子
Dec 26 Python
python正则过滤字母、中文、数字及特殊字符方法详解
Feb 11 Python
Python Websocket服务端通信的使用示例
Feb 25 Python
Python Selenium模块安装使用教程详解
Jul 09 Python
Python简单遍历字典及删除元素的方法
Sep 18 #Python
Python实现压缩与解压gzip大文件的方法
Sep 18 #Python
Python打包文件夹的方法小结(zip,tar,tar.gz等)
Sep 18 #Python
Python简单格式化时间的方法【strftime函数】
Sep 18 #Python
Python简单获取自身外网IP的方法
Sep 18 #Python
Python简单检测文本类型的2种方法【基于文件头及cchardet库】
Sep 18 #Python
Python3实现并发检验代理池地址的方法
Sep 18 #Python
You might like
一些php项目中比较通用的php自建函数的详解
2013/06/06 PHP
WAF的正确bypass
2017/01/05 PHP
详谈php中 strtr 和 str_replace 的效率问题
2017/05/14 PHP
url 编码 js url传参中文乱码解决方案
2010/04/11 Javascript
JavaScript中的值是按值传递还是按引用传递问题探讨
2015/01/30 Javascript
javascript实现网页屏蔽Backspace事件,输入框不屏蔽
2015/07/21 Javascript
浅析JavaScript 调试方法和技巧
2015/10/22 Javascript
jQuery ajax调用后台aspx后台文件的两种常见方法(不是ashx)
2016/06/28 Javascript
JS中setTimeout和setInterval的最大延时值详解
2017/02/13 Javascript
使用mint-ui开发项目的一些心得(分享)
2017/09/07 Javascript
Vue动态生成el-checkbox点击无法赋值的解决方法
2019/02/21 Javascript
微信小程序textarea层级过高的解决方法
2019/03/04 Javascript
[04:29]2016国际邀请赛中国区预选赛Ehome战队教练采访
2016/06/27 DOTA
使用Python编写vim插件的简单示例
2015/04/17 Python
深入理解Python中的*重复运算符
2017/10/28 Python
使用Py2Exe for Python3创建自己的exe程序示例
2018/10/31 Python
Python基本socket通信控制操作示例
2019/01/30 Python
Python动态参数/命名空间/函数嵌套/global和nonlocal
2019/05/29 Python
python向字符串中添加元素的实例方法
2019/06/28 Python
django商品分类及商品数据建模实例详解
2020/01/03 Python
Python打印特殊符号及对应编码解析
2020/05/07 Python
浅谈keras保存模型中的save()和save_weights()区别
2020/05/21 Python
python调用jenkinsAPI构建jenkins,并传递参数的示例
2020/12/09 Python
python爬取微博评论的实例讲解
2021/01/15 Python
使用phonegap播放音频的实现方法
2017/03/31 HTML / CSS
美国最大的袜子制造商和零售商:Renfro Socks
2017/09/03 全球购物
解释一下ArrayList Vector和LinkedList的实现和区别
2013/04/26 面试题
汉语言文学毕业生求职信
2013/10/01 职场文书
人事部主管岗位职责
2013/12/26 职场文书
新闻报道策划方案
2014/06/11 职场文书
艺术学院毕业生求职信
2014/07/09 职场文书
小区保洁员岗位职责
2015/04/10 职场文书
2015年新农村建设指导员工作总结
2015/07/24 职场文书
如何才能写好调研报告?
2019/07/03 职场文书
少年的你:世界上没有如果,要在第一次就勇敢的反抗
2019/11/20 职场文书
go语言使用Casbin实现角色的权限控制
2021/06/26 Golang