__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

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

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

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

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

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文件_Python __init__.py 作用详解相关推荐

  1. Python __init__.py 作用详解

    __init__.py 文件的作用是将文件夹变为一个Python模块,Python 中的每个模块的包中,都有__init__.py 文件. 通常__init__.py 文件为空,但是我们还可以为它增加 ...

  2. python fileinput_python文件处理fileinput使用方法详解

    这篇文章主要介绍了python文件处理fileinput使用方法详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 一.介绍 fileinput模块 ...

  3. python 相对导入_Python相对导入机制详解

    Google FEB 26TH, 2015 Python相对导入机制详解 这个答案能解释大多关于 relative import,即相对导入的疑惑,讲解十分详尽清晰,算是 SO 上被低估的一个答案. ...

  4. python模块讲解_python中常用模块详解一

    1.time 模块 import time s = time.localtime() # 把时间转化成格式化的时间,通过. 取得里面的年月日等 struct_time 格式 time.struct_t ...

  5. Python 相关文件常见的后缀名详解

    常见的 Python 文件后缀有:py.pyc .pyo. pyi.pyw. pyd. pyx 等. 本文只介绍相对常见的一些后缀名,至于一些特别冷门的文件格式,例如一些文章提到的pyz.pywz.r ...

  6. python输出命令_Python输出各行命令详解

    创建main.py文件并粘贴下面代码 点击右键运行Debug 'main'后,下方的Debug窗口会出现ImportError: No module named 'bottle'这样的提示,提示导入b ...

  7. python 类 实例_Python类的实例详解

    类(class)是一个用户自定义类型,开发者可以将其实例化以获得实例(instance),实例表示这种类型的对象.在Python中,类就是对象,开发者可以像对其他对象那样处理函数,可以在调用函数时传递 ...

  8. python pdb 安装_Python调试工具pdb使用详解

    Python调试工具pdb使用详解 [简介] pdb是Python自带的一个包,为python程序提供了一种交互的源代码调试功能. [使用方法] 1. 使用命令: python -m pdb xxx. ...

  9. python md5加密_Python MD5加密实例详解

    详解Python MD5加密 Python 3下MD5加密 # 由于MD5模块在python3中被移除 # 在python3中使用hashlib模块进行md5操作 import hashlib # 待 ...

最新文章

  1. 5个短小精悍的 Python 趣味脚本,太赞了,非常适合小白上手!
  2. LeetCode-笔记-45.跳跃游戏II-贪心算法
  3. SharePoint 2013 商城
  4. 服务器系统日志有哪些centos,CentOS 分析服务器日志命令
  5. [Bugku][Web][CTF] 16-29 write up
  6. js在类的方法中访问自己的属性
  7. 用手机写代码:基于 Serverless 的在线编程能力探索
  8. openstack之创建虚拟机
  9. 评分预测会不会大于满分5.0的情况?
  10. golang mac 环境变量_Golang (Go语言) Mac OS X下环境搭建 环境变量配置 开发工具配置 Sublime Text 2...
  11. 计算机硬盘大小一般都是整数,电脑硬盘如何精准整数分区
  12. 用php表示掷骰子两次比大小,php实现的中秋博饼游戏之掷骰子并输出结果功能详解...
  13. oracle手动锁表和解锁_oracle锁表查询和解锁方法是什么
  14. 用户画像的定义及构建方法
  15. 排列组合思维导图_巧用思维导图做数学单元整理
  16. Python3 etree, requests库抓取bt
  17. MongoDB系列之添加账号和密码
  18. JavaScript 基本面试问题总结
  19. Ubuntu 16.04 4k屏高分辨率卡顿问题
  20. USB设备无法识别也无法读取怎么办?

热门文章

  1. TCP/IP协议、DoD模型、OSI模型
  2. 设计模式笔记之 - Composite
  3. 虚树+树型DP SDOI2011消耗战
  4. 【译】索引进阶(八):SQL SERVER唯一索引
  5. .NET开发人员必看:提高ASP.NET Web应用性能的24种方法和技巧——转
  6. MySQL 函数积累
  7. Android使用SeekBar
  8. poj 1724 有限制的最短距离(优先队列+链表)
  9. 软考信息系统项目管理师_项目风险管理---软考高级之信息系统项目管理师019
  10. Sentinel一键下载安装运行_分布式系统集群限流_线程数隔离_削峰填谷_流量控制_速率控制_服务熔断_服务降级---微服务升级_SpringCloud Alibaba工作笔记0030