Python中的Module是比较重要的概念。常见的情况是,事先写好一个.py文 件,在另一个文件中需要import时,将事先写好的.py文件拷贝

到当前目录,或者是在sys.path中增加事先写好的.py文件所在的目录,然后import。这样的做法,对于少数文件是可行的,但如果程序数目很多,层级很复杂,就很吃力了。 有没有办法,像Java的Package一样,将多个.py文件组织起来,以便在外部统一调用,和在内部互相调用呢?答案是有的。

主要是用到python的包的概念,python init.py在包里起一个比较重要的作用要弄明白这个问题,首先要知道,python在执行import语句时,到底进行了什么操作,按照python的文档,它执行了如下操作:

第1步,创建一个新的,空的module对象(它可能包含多个module);

第2步,把这个module对象插入sys.module中

第3步,装载module的代码(如果需要,首先必须编译) 第4步,执行新的module中对应的代码。

在执行第3步时,首先要找到module程序所在的位置,其原理为:

如果需要导入的module的名字是m1,则解释器必须找到m1.py,它首先在当前目录查找,然后是在环境变量PYTHONPATH中查找。 PYTHONPATH

可以视为系统的PATH变量一类的东西,其中包含若干个目录。如果PYTHONPATH没有设定,或者找不到m1.py,则继续搜索与python的安装设置相关的默认路径,在Unix下,通常是/usr/local/lib/python。 事实上,搜索的顺序是:当前路径(以及从当前目录指定的sys.path),然后是PYTHONPATH,然后是python的安装设置相关的默认路径。正因为存在这样的顺序,如果当前路径或PYTHONPATH中存在与标准module同样的module,则会覆盖标准module。也就是说,如果当前目录下存在xml.py,那么执行import xml时,导入的是当前目录下的module,而不是系统标准的xml。

了解了这些,我们就可以先构建一个package,以普通module的方式导入,就可以直接访问此package中的各个module了。 Python中的pac

kage定义很简单,其层次结构与程序所在目录的层次结构相同,这一点与Java类似,唯一不同的地方在于,python中的package必须包含一个__init

__.py的文件。 例如,我们可以这样组织一个package:

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可以为空,只要它存在,就表明此目录应被作为一个package处理。当然,init.py中也可以设置相应的内容,下文详细介绍。好了,现在我们在module_11.py中定义一个函数:

def funA():

print "funcA in module_11"

return

在顶层目录(也就是package1所在的目录,当然也参考上面的介绍,将package1放在解释器能够搜索到的地方)运行python:

>>> from package1.subPack1.module_11 import funcA

>>> funcA()

funcA in module_11

这样,我们就按照package的层次关系,正确调用了module_11中的函数。细心的用户会发现,有时在import语句中会出现通配符*,导入某个module中的所有元素,这是怎么实现的呢?答案就在__init__.py中。我们在subPack1的__init__.py文件中写

__all__ = ['module_13', 'module_12']

然后进入python

>>>from package1.subPack1 import *

>>>module_11.funcA()

Traceback (most recent call last):

File "", line 1, in

ImportError: No module named module_11

也就是说,以*导入时,package内的module是受__init__.py限制的。 好了,最后来看看,如何在package内部互相调用。如果希望调用同一个package中的module,则直接import即可。也就是说,在module_12.py中,可以直接使用

import module_11

如果不在同一个package中,例如我们希望在module_21.py中调用module_11.py中的FuncA,则应该这样:

from module_11包名.module_11 import funcA

python的使用说明_Python教程:Python中__init__.py的使用用法说明相关推荐

  1. python包的init文件_Python模块包中__init__.py文件功能分析

    本文实例讲述了Python模块包中__init__.py文件功能.分享给大家供大家参考,具体如下: 用django做开发已经一年多的时间,但基本没注意python模块中__init__.py文件存在的 ...

  2. python模块 init py_Python模块包中__init__.py文件的作用

    在eclipse中用pydev开发Python脚本时,我遇到了一个这样的现象,当我新建一个pydev package时,总会自动地生成一个空的__init__.py文件,因为是python新手,所以很 ...

  3. python程序文件的扩展名称是什么_python程序文件的扩展名称是什么_Python教程,python,扩展名...

    python绘制正方形螺旋线_Python教程 python绘制正方形螺旋线的方法:1.使用import turtle as t导入绘图库,并设置别名为t:2.使用t.goto(x,y)方法以某一点为 ...

  4. pythonipo模型包括_python ipo模型是指什么?_Python教程,python,ipo,模型

    python与平台有关吗_Python教程 Python与平台无关,因为Python是跨平台的语言,Python作为脚本语言,是解释执行的,所以能跨平台,前提是必须要有一个对应的解释器. python ...

  5. Python模块包中__init__.py文件的作用(转载)

    用django做开发已经一年多的时间,但基本没注意python模块中__init__.py文件存在的意义,偶然看到对它的介绍吓一大跳,这个文件太重要了 模块包: 包通常总是一个目录,目录下为首的一个文 ...

  6. python绘制四叶草_python绘图四叶草_Python教程,python,绘图

    Python阶乘求和的方法_Python教程 Python阶乘求和的方法:首先定义一个getSum函数,在函数内使用for循环调用fact函数:然后在fact函数内对一个数进行求阶乘运算,并将计算的结 ...

  7. 视频教程-Python零基础入门教程-Python

    Python零基础入门教程 从2012年从事互联网至今有7年软件编程经验,曾任职国内北京互联网公司,中南林业大学授课Python 现任逻辑教育Python课程负责人,精通Python语言,精通人工智能 ...

  8. python3 class init_python3 module中__init__.py的需要注意的地方

    网上关于__init__.py的作用的资料到处都是,我在此就不再啰嗦哪些了. 若有需要.请各位看官去搜搜即可. 最近刚开始用Python3 就遇到了这个比较有意思的事情 闲言少叙,下面要介绍的是pyt ...

  9. python的init有什么用_Python中 __init__.py的作用

    我们经常在python的模块目录中会看到 "__init__.py"  这个文件,那么它到底有什么作用呢? 1. 标识该目录是一个python的模块包(module package ...

最新文章

  1. C#人爱学不学9[C#5.0异步实例+WPF自己的MVVM Async应用 1/12]
  2. python数据分析入门
  3. scp 、ssh非22端口的服务器方法
  4. english grammar in use 电子版_③ 采购笔记之节点与凭证、采购的进阶、采购合同要素。(电子版整理中)...
  5. 利用InfoPath生成XML资源文件
  6. 计算机网络章末总结,计算机网络 (前两章总结)
  7. web 开发 —— html 与 css(div)
  8. 计算机用户怎么去掉中文,电脑英文系统怎么设置回中文
  9. Python分析成绩
  10. vue中a标签的href属性的写法
  11. 这个春天,邀你一起探寻AI与青春的碰撞之力
  12. 1253. 将数字转换为16进制
  13. 扫描dir目录函数之scandir()
  14. 腾讯是如何做Unity手游性能优化的
  15. 比Postman还好用的API神器Eolink,效率担当
  16. 嵌入式Linux获取系统时间
  17. Dual-View Distilled BERT for Sentence Embedding
  18. 2020-09-23
  19. 三极管放大电路的输出电阻
  20. 虚拟 高性能计算 ScaleMP- HPC:- PC搭建超级计算机

热门文章

  1. 基于JAVA+Servlet+JSP+MYSQL的电影院购票系统
  2. (转载)C中实参与形参的“值传递”只能“单向传送”(透彻的理解)
  3. Spring 依赖注入(一、注入方式)
  4. Java 集合系列16之 HashSet详细介绍(源码解析)和使用示例
  5. WEB开发中常用的正则表达式
  6. colgroup标签
  7. asp.net mvc(八)
  8. ios pan手势滑动消失动画_解析Color OS全面屏手势,操作丝滑,操作逻辑帮了大忙...
  9. jemeter python接口自动化测试平台_WEB接口开发与自动化测试基于PYTHON语言PDF_Python教程...
  10. 一文掌握Python集合的语法与应用