摘要:原理根据的开发文档,模块导入主要有以下的步骤,创建一个新空的对象它可能包含多个,把这个对象插入中,装载的代码如果需要,首先必须编译,执行新的中对应的代码。因此可以将初始化代码放入该文件中。
@
开始拿着github上的python
代码狂啃时,发现很多知道干嘛又不知道为啥这样的代码,开始疯狂补漏。???
比如这样的架构:
package1/ -- subPack1/ -- __init__.py -- module_11.py -- module_12.py -- module_13.py --subPack2/ -- __init__.py -- module_21.py -- module_22.py ……
如果想在module_21.py
中导入module_11.py
的某一个class或者function时,则需要subPack1中包含__init__.py
,即使__init__.py
是空的也可以,否则会报错找不到module。
根据python的开发文档,模块导入主要有以下的步骤:
1,创建一个新空的module对象(它可能包含多个module)
2,把这个module对象插入sys.module中
3,装载module的代码(如果需要,首先必须编译)
4,执行新的module中对应的代码。
在执行第3步时,首先要找到module程序所在位置,其查找顺序如下
1.在当前路径以及当前目录指定的sys.path
2.从环境变量PYTHONPATH进行查找
3.python
的安装设置相关的默认路径
如果当前路径或者PYTHONPATH存在与标准module相同的module,则会覆盖标准module,也就是说,如果当下目录存在xml.py
那么执行import xml.py
时,导入的当前目录下的module,而不是系统标准的xml。
那现在问题来了,怎么知道去哪儿找这些模块呢,有的文件夹我想被搜索,有的文件夹不想被搜索,这里就需要__init__.py
文件了,在文件夹下面有这个文件,则默认该文件夹是个package,可以被搜索到。这是__init__.py
的用处之一。
比如有个python文件依赖上面的所有文件:
from package1.subPack1 import module_11from package1.subPack1 import module_12from package1.subPack1 import module_21from package1.subPack2 import module_22from package1.subPack2 import module_23
这个例子里面文件比较少,如果模块比较大,目录比较深的话,可能自己都记不清该如何导入。这种情况下,__init__.py
就很有作用了。我们先来看看该文件是如何工作的。
实际上,如果目录中包含了 __init__.py
时,当用 import 导入该目录时,会优先执行 __init__.py
里面的代码。
我们在package1目录下增加一个__init__.py
文件:
package1/ -- __init__.py -- subPack1/ -- __init__.py -- module_11.py -- module_12.py -- module_13.py --subPack2/ -- _ _init__.py -- module_21.py -- module_22.py ……
如果在__init__.py
里面print一句话print("the package1 is loaded ")
,再在python下导入包
>>python>>import package1the package1 is loaded
这样我们就可以在__init__.py
里面导入需要文件包:
from package1.subPack1 import module_11
然后在python里面导入整个包:
import package1
如果要导入package1下面整个文件夹下面的包,则偷懒一点:
from package1 import *
这里引出了另外一个问题,为啥* 能导入所有的模块呢,这里涉及到一个变量__all__
(这里后续补充)
综上,在了解了 __init__.py
的工作原理后,应该能理解该文件就是一个正常的python代码文件。 因此可以将初始化代码放入该文件中。
文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。
转载请注明本文地址:https://www.ucloud.cn/yun/125015.html
摘要:文件和导包总结也是一门学问导入方式的作用把某一个目录变成一个包,使得其他模块使用包包中的某一模块函数变量类这种方式时可用什么时候有用如果某一个目录在后期导入使用时只是作为中间目录衔接使用,则可以不加,如果某个目录后期会被直接或间接显示地作为 python __init__.py文件和导包总结 import也是一门学问~ 导入方式 import from xxx import y...
摘要:所以在多线程中,线程的运行仍是有先后顺序的,并不是同时进行。哈希函数的目的是使键均匀地分布在数组中。由于不同的键可能具有相同的哈希值,即可能出现冲突,高级的哈希函数能够使冲突数目最小化。 首先这篇文章在我的《Python数据结构》公众号已经提及,但是本篇文章提供了更为高级的解法,来发散大家的思维;同时为大家提供我的草稿py文件,大家可以关注《Python数据结构》公众号后恢复 120 ...
摘要:当功能越来越复杂的时候,你可能修改了一些东西,导致另外一个功能的不可用,而单元测试也能保证了原有功能被破坏后能被检测出来。 showImg(https://segmentfault.com/img/remote/1460000017081749); 前言 前一篇讲到了 TDD 测试驱动开发的相关概念和环境搭建,这篇就着手开始用TDD方式开发了。首先这篇需要编写用户相关的API接口,如...
摘要:扩展支持多用户并发访问与线程池。项目请见初学网络编程之服务器。不允许超过磁盘配额。该文件是一个使用模块编写的线程池类。这一步就做到了线程池的作用。 对MYFTP项目进行升级。扩展支持多用户并发访问与线程池。MYFTP项目请见python初学——网络编程之FTP服务器。 扩展需求 1.在之前开发的FTP基础上,开发支持多并发的功能2.不能使用SocketServer模块,必须自己实现多线...
摘要:中常用的几个框架有等,今天来总结一下和的不同。本文使用的环境是。文件可以加载路由信息和项目配置信息,文件负责启动项目。以上就简单的比较了和几个方面的不同,它们各有优缺点,实际工作中可以根据不同的需求选择不同的框架进行开发。 python中常用的几个web框架有django, tornado, flask等,今天来总结一下django和tornado的不同。工作中django和torna...
阅读 3315·2021-11-25 09:43
阅读 1302·2021-11-23 09:51
阅读 3608·2021-10-11 11:06
阅读 3697·2021-08-31 09:41
阅读 3596·2019-08-30 15:53
阅读 3509·2019-08-30 15:53
阅读 965·2019-08-30 15:43
阅读 3306·2019-08-29 14:02