使用Python模块常见的情况是,事先写好A.py文件,需要import B.py文件时,先拷贝到当前目录,然后再import

这样的做法在程序量较小的情况下是可行的,如果程序交互复杂程度稍高,就很费力了

有一种解决方法可以将多个.py文件组织起来,方便在外部统一调用,和在内部互相调用:python中的 __init__.py在包调用中起到了重要的作用

首先要明确的Python在执行import包的时候,执行的操作,按照python的文档描述,操作如下:

a) 创建一个新的,空的module对象(它可能包含多个module);
b) 把这个module对象插入sys.module中
c) 装载module的代码(如果需要,首先必须编译) (首先需要找到module程序所在的位置,其原理为:如果需要导入的module的名字是m1,则解释器必须找到m1.py,它首先在当前目录查找,然后是在环境变量PYTHONPATH中查找)
d) 执行新的module中对应的代码。

Python中的package定义很简单,其层次结构与.py所在目录的层次结构相同,比较关键的一点是package中必须包含一个__init__.py的文件

例如,我们可以这样组织一个package: init为顶层目录

运行结果如下

其中__init__.py可以为空,只要它存在,解释器对其视作一个package处理。

第一层:pack, pack2, main.py

第二层 pack: __init__.py,module_A.py

    pack2:__init__.py,module_B.py

main.py 调用脚本:

from pack import func1
from pack import func2
from pack2 import print_lst
def main():
func1()
func2()
print_lst() if __name__ == "__main__":
main()

其中 module_A:

def func1():
print("MODULEAAAAA_func1111") def func2():
print("MODULEAAAAA_func2222")

同一层 __init__.py

from .module_A import func1
from .module_A import func2

.module_A 表示__init__.py同一层目录的module_A

个人理解是:当 main.py调用脚本from pack import func1

由于from操作 会默认目录下存在pack包,解释器会首先寻找__init__.py

而__init__.py内容不为空,对module_A引入了两个函数fun1,fun2,生成了函数引用域(太菜不知道专属名词)

所以在main.py 中可以不显式地指明module_A而直接用: from pack import fun1,fun2

如果把pack下的init.py 的第二行 import func2注释

也就是说,package内的module的import 是受__init__.py限制的

有时在import语句中会出现通配符*,导入某个module中的所有元素,这是怎么实现的呢?
答案就在__init__.py中。如果在__init__.py文件中写(指定)

__all__ = ['module_A']

如果改为

__all__ = []
Traceback (most recent call last):
File "<stdin>", line , in <module>
ImportError: No module named module_A

运行则会报错,如上

这也就是说,package内的module的导入是受__init__.py限制的

好了,最后来看看,如何在package内部互相调用。

如果希望调用同一个package中的module,则直接import即可。

也就是说,在module_A.py中,可以直接使用import module_others
如果不在同一个package中,例如我们希望在module_A.py中调用module_B.py中的FuncB,则应该这样:
from module_B的包名(目录).module_B import funcB

python 中的__init__.py的用法与个人理解的更多相关文章

  1. 【转】【Python】Python中的__init__.py与模块导入(from import 找不到模块的问题)

    python中的Module是比较重要的概念.常见的情况是,事先写好一个.py文 件,在另一个文件中需要import时,将事先写好的.py文件拷贝 到当前目录,或者是在sys.path中增加事先写好的 ...

  2. Python中的__init__.py的作用

    当用 import 导入该目录时,会执行 __init__.py 里面的代码 因此在__init__.py文件中,把深层的包的路径缩短,别的地方就可以在引用到目录级别时引到深层的包.

  3. Python中【__all__】的用法

    Python中[__all__]的用法 转:http://python-china.org/t/725 用 __all__ 暴露接口 Python 可以在模块级别暴露接口: __all__ = [&q ...

  4. python2中的__init__.py文件的作用

    python2中的__init__.py文件的作用: 1.python的每个模块的包中,都必须有一个__init__.py文件,有了这个文件,我们才能导入这个目录下的module. 2.__init_ ...

  5. Python中logging模块的基本用法

    在 PyCon 2018 上,Mario Corchero 介绍了在开发过程中如何更方便轻松地记录日志的流程. 整个演讲的内容包括: 为什么日志记录非常重要 日志记录的流程是怎样的 怎样来进行日志记录 ...

  6. Python中zip()与zip(*)的用法

    目录 Python中zip()与zip(*)的用法 zip() 知识点来自leetcode最长公共前缀 Python中zip()与zip(*)的用法 可以看成是zip()为压缩,zip(*)是解压 z ...

  7. python中的__init__ 、__new__、__call__小结

    这篇文章主要介绍了python中的__init__ .__new__.__call__小结,需要的朋友可以参考下 1.__new__(cls, *args, **kwargs)  创建对象时调用,返回 ...

  8. 简单说明Python中的装饰器的用法

    简单说明Python中的装饰器的用法 这篇文章主要简单说明了Python中的装饰器的用法,装饰器在Python的进阶学习中非常重要,示例代码基于Python2.x,需要的朋友可以参考下   装饰器对与 ...

  9. Python中的__init__()和__call__()函数

    Python中的__init__()和__call__()函数 在Python的class中有一些函数往往具有特殊的意义.__init__()和__call__()就是class很有用的两类特殊的函数 ...

随机推荐

  1. 汇编语言--微机CPU的指令系统(五)(移位操作指令)

    (5) 移位操作指令 移位操作指令是一组经常使用的指令,它包括算术移位.逻辑移位.双精度移位.循环移位和带进位的循环移位等五大类. 移位指令都有指定移动二进制位数的操作数,该操作数可以是立即数或CL的 ...

  2. LintCode Majority Number II / III

    Given an array of integers, the majority number is the number that occurs more than 1/3 of the size ...

  3. laravel接值 get post

    laravel使用一种简单的方式来访问用户提交的信息. 你可以用统一的方式来访问用户提交的信息,而不用为用户提交信息的方式操心. 引用类:use Illuminate\Support\Facades\ ...

  4. DOCTYPE声明作用?标准模式与兼容模式?

    <!DOCTYPE>文档声明是用来告诉浏览器使用哪种DTD,一般放在(X)HTML文档开头声明,用以告诉其他人这个文档的类型风格:DTD(文档类型定义)是一组机器可读的规则,它们指示(X) ...

  5. LNMP的配置与优化

    一.LNMP的下载 LNMP一键安装包是一个用Linux Shell编写的可以为CentOS/RadHat/Fedora.Debian/Ubuntu/Raspbian/Deepin VPS或独立主机安 ...

  6. Spring IOC/DI

    IOC:反转控制(资源获取),之前开发是要什么就 new 什么,现在只需创建 IOC 容器,你要什么 IOC 都会给你,你只管接收.反转控制的对象是 Bean,也就是对象 DI:依赖注入,依赖容器把资 ...

  7. windows查看笔记本电池使用报告

    CMD 下 powercfg /batteryreport /output “C:\battery_report.html” powercfg 参数 /LIST./L          列出所有电源方 ...

  8. The concurrent snapshot for publication 'xxx' is not available because it has not been fully generated or the Log Reader Agent is not running to activate it

    在两台测试服务器部署了复制(发布订阅)后,发现订阅的表一直没有同步过来.重新生成过snapshot ,也重新初始化过订阅,都不能同步数据,后面检查Distributor To Subscriber H ...

  9. 语句调优基础知识-set statistics time on

    set statistics time on --清空缓存数据 dbcc dropcleanbuffers go --清空缓存计划 dbcc freeproccache go set statisti ...

  10. xtrabackup部署以及使用

    简介 备份mysql数据库一直是一个比较恶心的工作,主要就是备份的数据库比较大实在是慢.最近开始使用xtrabackup来备份数据库,速度上快了很多,尤其还原速度要快的多.下面我将从安装开始简要介绍一 ...