python模块与包

模块与包

模块

之前说过使用函数能够实现代码的可重用,但是是在同一文件内的调用。随着程序代码越写越多,在一个文件中代码会越来越长,越来越不容易维护。为了编写可维护的代码,我们把很多函数分组,分别放到不同的文件里,这样,每个文件包含的代码就相对较少,维护也更方便。

在Python中,一个.py文件就称之为一个模块(Module)。
Python中模块分为三种: Python标准库,第三方模块,应用程序自定义模块

使用模块可以帮助避免函数与其他模块函数重名,函数名与变量名重名的问题。此外,要尽量避免定义的模块名与内置函数(build in function)重名。

模块导入方法

import语句

import module1[, module2[,... moduleN]

当使用import语句时,python会首先去内置模块里搜索模块,如果没有搜索到就会到python的模块搜索路径里去搜索,这个路径的列表可以通过sys.path查看。所以我们在导入非内置模块时不要在当前目录下命名与之同名的py文件,这会导致你导入的就是当前目录下的py文件。

import模块时解释器做了哪些事

执行文件执行import时:

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

  • 在新建的命名空间中执行模块的代码

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

总结起来就是遇到import语句就会执行模块文件的代码,可以通过模块名访问这个模块中的函数和变量。不过多次导入同一模块时,只有第一次导入会执行源文件内的代码,原因是:第一次导入就会将模块包含的内容统统加载到内存了,以后在当前文件位置的导入都是指向内存中已有的模块。

示例
导入模块并引用

>>> import time
>>> print (time)
<module 'time' (built-in)>
>>> time.time()
1498650686.3658507
>>> time.strftime('%Y-%m-%d %X')
'2017-06-28 19:52:08'

导入模块,为模块起别名

>>> import math as mh
>>> mh.sqrt(4)
2.0

from...import语句

from modname import name1[, name2[, ... nameN]]

同样,遇到import就会执行模块中代码,不过这个声明不会把整个
modulename模块导入到当前的命名空间中,只会将它里面的name1或name2单个引入到执行这个声明的模块的全局符号表。

其中, from…import* 语句提供了一个简单的方法来导入一个模块中的所有项目。然而这种声明不该被过多地使用。大多数情况, Python程序员不使用这种方法,因为引入的其它来源的命名,很可能覆盖了已有的定义。

如果不同的人编写的模块名相同怎么办?为了避免模块名冲突,Python又引入了按目录来组织模块的方法,称为包(Package)。

在python中,每一个包目录下面都会有一个__init__.py的文件,这
个文件是必须存在的,否则,Python就把这个目录当成普通目录(文件
夹),而不是一个包。__init__.py可以是空文件,也可以有Python
代码(一般为初始化包的代码),因为__init__.py本身就是一个模
块,而它的模块名就是对应包的名字。 

调用包就是执行包下的__init__.py文件 

引入了包以后,只要顶层的包名不与别人冲突,那所有模块都不会与别人冲突。

导入包:
无论是import形式还是from...import,凡是在导入语句中(而不是在使用时)遇到带点的,都要第一时间提高警觉:这是关于包才有的导入语法,点的左边都必须是一个包,否则非法。可以带有一连串的点,如item.subitem.subsubitem,但都必须遵循这个原则。
包的本质就是一个包含__init__.py文件的目录。

无论使用import还是from import,只要是第一次导入包或者是包的
任何其他部分,都会依次执行包下的__init__.py文件。

__name__

在python中经常会看到
if __name__=='__main__':
main() #main()函数或者其它语句

这个语句的作用就是当你在这个代码文件里执行时__name__就是等于
'__main__'这个字符串的,而当这个代码文件作为模块被导入到其它文件时,它的__name__等于导入模块的模块名,这时这个判断就不成立,就不会执行main()函数。也就是说作为模块导入时只导入main()代码的定义,不会执行。所以以后开发建议用这种方式执行函数。

使用这个语句能够便于调试代码。即一个模块被调用的时候不执行内容,而自己调试模块的时候可以顺利的执行模块内容。

原文地址:https://www.cnblogs.com/liao-lin/p/7091968.html