学习python的时候,碰到了import 和 from xx import xx的问题, 为了弄清楚什么是 module 和package ,这篇文章讲解的不错!!

原文: http://www.cnblogs.com/kex1n/p/5977051.html

----------------------------------------------------------------------

类的概念在许多语言中出现,很容易理解。它将数据和操作进行封装,以便将来的复用。

模块

模块,在Python可理解为对应于一个文件。在创建了一个脚本文件后,定义了某些函数和变量。你在其他需要这些功能的文件中,导入这模块,就可重用这些函数和变量。一般用module_name.fun_name,和module_name.var_name进行使用。这样的语义用法使模块看起来很像类或者名字空间,可将module_name 理解为名字限定符。模块名就是文件名去掉.py后缀。

client.py

def func():
    print "hello world!"

main.py

import client
if __name__ == '__main__':
    print __name__
    client.func()
    print client.__name__

>>python main.py  ---> result:

__main__

hello world!

client

模块属性__name__,它的值由Python解释器设定。如果脚本文件是作为主程序调用,其值就设为__main__,如果是作为模块被其他文件导入,它的值就是其文件名。

每个模块都有自己的私有符号表,所有定义在模块里面的函数把它当做全局符号表使用。

模块可以导入其他的模块。通常将import语句放在模块的开头,被导入的模块名字放在导入它的模块的符号表中。

from module import names  可以直接从模块中导入名字到符号表,但模块名字不会被导入。
from module import *     可以把模块中的所有名字全部导入,除了那些以下划线开头的名字符号。不建议使用,不清楚导入了什么符号,有可能覆盖自己定义的东西
内建函数dir()可以查看模块定义了什么名字(包括变量名,模块名,函数名等):dir(模块名),没有参数时返回所有当前定义的名字

模块搜索路径

当导入一个模块时,解释器先在当前包中查找模块,若找不到,然后在内置的built-in模块中查找,找不到则按sys.path给定的路径找对应的模块文件(模块名.py)
sys.path的初始值来自于以下地方:
包含脚本当前的路径,当前路径
PYTHONPATH
默认安装路径
sys.path初始化完成之后可以更改
编译过的Python文件: .pyc文件
built-in 模块

上面的例子中,当client被导入后,python解释器就在当前目录下寻找client.py的文件,然后再从环境变量PYTHONPATH寻找,如果这环境变量没有设定,也不要紧,解释器还会在安装预先设定的的一些目录寻找。这就是在导入下面这些标准模块,一切美好事情能发生的原因。

这些搜索目录可在运行时动态改变,比如将module1.py不放在当前目录,而放在一个冷僻的角落里。这里你就需要通过某种途径,如sys.path,来告知Python了。sys.path返回的是模块搜索列表,通过前后的输出对比和代码,应能理悟到如何增加新路径的方法了吧。非常简单,就是使用list的append()或insert()增加新的目录。

#module2.py
import sys
import osprint sys.path
workpath = os.path.dirname(os.path.abspath(sys.argv[0]))
sys.path.insert(0, os.path.join(workpath, 'modules'))
print sys.path

其他的要点

模块能像包含函数定义一样,可包含一些可执行语句。这些可执行语句通常用来进行模块的初始化工作。这些语句只在模块第一次被导入时被执行。这非常重要,有些人以为这些语句会多次导入多次执行,其实不然。

模块在被导入执行时,python解释器为加快程序的启动速度,会在与模块文件同一目录下生成.pyc文件。我们知道python是解释性的脚本语言,而.pyc是经过编译后的字节码,这一工作会自动完成,而无需程序员手动执行。

通常包总是一个目录,可以使用import导入包,或者from + import来导入包中的部分模块。包目录下为首的一个文件便是 __init__.py。然后是一些模块文件和子目录,假如子目录中也有 __init__.py 那么它就是这个包的子包了。

在创建许许多多模块后,我们可能希望将某些功能相近的文件组织在同一文件夹下,这里就需要运用包的概念了。包对应于文件夹,使用包的方式跟模块也类似,唯一需要注意的是,当文件夹当作包使用时,文件夹需要包含__init__.py文件,主要是为了避免将文件夹名当作普通的字符串。__init__.py的内容可以为空,一般用来进行包的某些初始化工作或者设置__all__值,__all__是在from package-name import *这语句使用的,全部导出定义过的模块。

可以从包中导入单独的模块。
1). import PackageA.SubPackageA.ModuleA,使用时必须用全路径名
2). 变种: from PackageA.SubPackageA import ModuleA, 可以直接使用模块名而不用加上包前缀。
3). 也可以直接导入模块中的函数或变量:from PackageA.SubPackageA.ModuleA import functionA
import语句语法:
1. 当使用from package import item时,item可以是package的子模块或子包,或是其他的定义在包中的名字(比如一个函数、类或变量)
首先检查item是否定义在包中,不过没找到,就认为item是一个模块并尝试加载它,失败时会抛出一个ImportError异常。
2. 当使用import item.subitem.subsubitem语法时,最后一个item之前的item必须是包,最后一个item可以是一个模块或包,但不能是类、函数和变量
3. from pacakge import *
如果包的__init__.py定义了一个名为__all__的列表变量,它包含的模块名字的列表将作为被导入的模块列表。
如果没有定义__all__, 这条语句不会导入所有的package的子模块,它只保证包package被导入,然后导入定义在包中的所有名字。
python包是:
包是一个有层次的文件目录结构,它定义了由n个模块或n个子包组成的python应用程序执行环境。
通俗一点:包是一个包含__init__.py 文件的目录,该目录下一定得有这个__init__.py文件和其它模块或子包。

常见问题:

  • 引入某一特定路径下的模块

    • 使用sys.path.append(yourmodulepath)
  • 将一个路径加入到python系统路径下,避免每次通过代码指定路径

    • 利用系统环境变量 export PYTHONPATH=$PYTHONPATH:yourmodulepath
    • 直接将这个路径链接到类似/Library/Python/2.7/site-packages目录下
  • 好的建议

    • 经常使用if __name__ == '__main__',保证你写包既可以import又可以独立运行,用于test。
    • 多次import不会多次执行模块,只会执行一次。可以使用reload来强制运行模块,但不提倡。

包(package)

为了组织好模块,将多个模块分为一个包。包是python模块文件所在的目录,且该目录下必须存在__init__.py文件。常见的包结构如下:

package_a
├── __init__.py
├── module_a1.py
└── module_a2.py
package_b
├── __init__.py
├── module_b1.py
└── module_b2.py
main.py
  • 如果main.py想要引用packagea中的模块modulea1,可以使用:
from package_a import module_a1
import package_a.module_a1
  • 如果packagea中的modulea1需要引用packageb,那么默认情况下,python是找不到packageb。我们可以使用sys.path.append('../'),可以在packagea中的__init__.py添加这句话,然后该包下得所有module都添加* import __init_即可。

转载于:https://www.cnblogs.com/oxspirt/p/7732281.html

python 类、模块、包的区别相关推荐

  1. python 类和函数的区别

    python中,在类中可以定义函数,类和函数都可作为一个模块保存. python的类和函数的区别主要在于类可以有变量和各种方法,而函数没有. 函数只能被运行,返回或者不返回值都可以. 模块如果没有把类 ...

  2. python 异常 模块 包

    #什么是异常 当Python检测到一个错误时,解释器就无法继续执行了,反而出现了一些错误的提示,这就是所谓的"异常" #捕获异常 使用try:...except:...来捕获异常, ...

  3. Python导入模块(包)的两种方式 TypeError: 'module' object is not callable

    Python编程时明明在开始处import了相关包,但是调用函数时就报错如下: TypeError: 'module' object is not callable Python中有两种导入包(模块, ...

  4. Python module模块 包 __name__

    模块:一个.py文件就称为一个模块(module) module的好处: •提高代码的可维护性,一个module编写完成,就可以被其它地方引用,不必重复编写,注意模块名应避免与python内置库重名 ...

  5. Python 模块/包的导入以及 import 的用法总结

    Python 模块/包的导入以及 import 的用法总结 一.模块/包 1. 前言 一个以 .py 为后缀的 Python 文件就是一个模块. 包是一个文件夹或一个目录. 每个包都有一个全局定义的配 ...

  6. python定义模块结束语_python-模块定义、导入、优化

    在Python中有一个概念叫做模块(module),比如在Python中要调用sqrt函数,必须用import关键字引入math这个模块,下面就来了解一下Python中的模块. 说的通俗点:模块就好比 ...

  7. python类定义的讲解_python类定义的讲解

    Python中的类属性和对象属性的区别详解 类属性: class Employee(object): emCount=0 def __init__(self,name,salary): self.na ...

  8. python创建字典和包的区别_python之路—模块和包

    一 模块 1 什么是模块? 常见的场景:一个模块就是一个包含了python定义和声明的文件,文件名就是模块名字加上.py的后缀. 但其实import加载的模块分为四个通用类别: 1 使用python编 ...

  9. python中模块文件的扩展名不一定是py_python模块和python包有什么区别?

    python模块和python包有什么区别? 另请参见:"package"和"module"(其他语言)之间的区别是什么? 我可能错了,但对我来说:模块基本上是 ...

  10. Python的包(package)和模块(module)的区别,如何导入python包和模块,以及为什么可以把包名当作一个模块导入

    本文主要讨论标题中的三大问题,接下来逐一分析: 文章大部分内容转载并重新整理自https://zhuanlan.zhihu.com/p/33913131 1. Python的包(package)和模块 ...

最新文章

  1. unity实战 实现鼠标选择对象前置显示
  2. intel 965集成显卡开启ubuntu9.10的3d效果
  3. TensorFlow Lite 正式发布,谷歌移动端深度学习框架
  4. 联想微型计算机报价,联想电脑一体机报价
  5. a4b5笔记本大小对比_天津订做笔记本*价格多少【广通印务】
  6. gitee如何搭建mysql_Windows基于gitee使用hexo搭建个人博客笔记
  7. 学Python可以用来干什么?就业情况究竟怎么样?
  8. html5的常用标签,HTML5常用标签
  9. PHP学习总结(11)——PHP入门篇之WAMPServer多站点配置
  10. luogu P1020 导弹拦截
  11. 量子计算机的系统论思考,量子计算机发展带来的思考..doc
  12. CFS完全公平调度类
  13. 【14年浙江省赛 ZOJ 3780】Paint the Grid Again【图转换】
  14. VSCode svn忽略文件提交
  15. wps xml转换表格_PDF转换神器安装步骤
  16. C#使用NPOI根据模板生成Word文件功能实现
  17. 裤子尺码对照表eur40_裤子尺寸对照表,衣服尺寸对照表,服装尺寸对照表 - 尺码对照表...
  18. 召回和粗排负样本构造问题
  19. 2022CCPC网络预选赛c题Problem C. Guess
  20. Linux下优雅的让程序后台运行

热门文章

  1. 【HDU - 5876】Sparse Graph(补图bfs,STLset)
  2. 【CodeForces - 1020B】Badge(模拟,图,环)
  3. 【HDU - 3068】最长回文(Manacher算法,马拉车算法求最长回文子串)
  4. 【CodeForces-1041C】Coffee Break(贪心,STL,set二分维护,题意难,有坑,SJ题,构造)(知识点总结)
  5. 无数种求逆元的方法总结
  6. Waymo研发经理:《自动驾驶感知前沿技术介绍》
  7. php 计算前几天,php计算几分钟前、几小时前、几天前的几个函数、类分享
  8. layui中日期格式化方式
  9. java 中文 编译_java编译带中文是显示乱码的错误
  10. 三个球A,B,C大小形状相同,且其中有一个球与其他球的重量不同,要求找出这个不一样的球