模块
在计算机程序的开发过程中,随着程序代码越写越多,在一个文件里代码就会越来越长,越来越不容易维护。
为了编写可维护的代码,我们把很多函数分组,分别放到不同的文件里,这样,每个文件包含的代码就相对较少,很多编程语言都采用这种组织代码的方式。在Python中,一个.py文件就称之为一个模块(Module)。
使用模块有什么好处?
最大的好处是大大提高了代码的可维护性。
其次,编写代码不必从零开始。当一个模块编写完毕,就可以被其他地方引用。我们在编写程序的时候,也经常引用其他模块,包括Python内置的模块和来自第三方的模块。
所以,模块一共三种:
- python标准库
- 第三方模块
- 应用程序自定义模块
另外,使用模块还可以避免函数名和变量名冲突。相同名字的函数和变量完全可以分别存在不同的模块中,因此,我们自己在编写模块时,不必考虑名字会与其他模块冲突。但是也要注意,尽量不要与内置函数名字冲突。
包(package)
通常包总是一个目录,可以使用import导入包,或者from + import来导入包中的部分模块。包目录下为首的一个文件便是 __init__.py。然后是一些模块文件和子目录,假如子目录中也有 __init__.py 那么它就是这个包的子包了。(如果__init__文件,python 2是不支持导入的,但是测试python 3支持)
原来在python模块的每一个包中,都有一个__init__.py文件(这个文件定义了包的属性和方法)然后是一些模块文件和子目录,假如子目录中也有 __init__.py 那么它就是这个包的子包了。当你将一个包作为模块导入(比如从 xml导入 dom )的时候,实际上导入了它的 __init__.py 文件。
一个包是一个带有特殊文件 __init__.py 的目录。__init__.py 文件定义了包的属性和方法。其实它可以什么也不定义;可以只是一个空文件,但是必须存在。如果 __init__.py 不存在,这个目录就仅仅是一个目录,而不是一个包,它就不能被导入或者包含其它的模块和嵌套包。
如果不同的人编写的模块名相同怎么办?为了避免模块名冲突,Python又引入了按目录来组织模块的方法,称为包(Package)。
举个例子,一个abc.py
的文件就是一个名字叫abc
的模块,一个xyz.py
的文件就是一个名字叫xyz
的模块。
现在,假设我们的abc
和xyz
这两个模块名字与其他模块冲突了,于是我们可以通过包来组织模块,避免冲突。方法是选择一个顶层包名:引入了包以后,只要顶层的包名不与别人冲突,那所有模块都不会与别人冲突
列:
有个abcd.py文件和 testa 同级目录
导入包 testa的时候 实际上就是 在执行testa里面的 __init__.py 这个文件
导入推荐写法:
from testa import scla
from testa.scla import show
from testa.web1 import scla
from testa.web1.scla import show
from testa import web1 #执行__init__文件
web1.scla.show(1) #以前的python老版本这样执行会报错 ;新版本支持了
为什么在python 目录找不到time模块 sys模块等 是因为C语言实现的内置到解释器里面的
import 是如何工作的:有如下2个文件
test.py里面导入import scla文件的时候,会先执行一遍scla.py文件,然后吧scla.py文件的内容全部获取过来给scla(也就是import scla)
执行结果:
sys.path路劲如下:可以看出来了第一搜索路径是当前目录
['D:\\xxxx\\testa', 'D:\\Study', 'C:\\Program Files (x86)\\Python36-32\\python36.zip', 'C:\\Program Files (x86)\\Python36-32\\DLLs', 'C:\\Program Files (x86)\\Python36-32\\lib', 'C:\\Program Files (x86)\\Python36-32', 'C:\\Users\\Think\\AppData\\Roaming\\Python\\Python36\\site-packages', 'C:\\Program Files (x86)\\Python36-32\\lib\\site-packages', 'C:\\Program Files (x86)\\Python36-32\\lib\\site-packages\\win32', 'C:\\Program Files (x86)\\Python36-32\\lib\\site-packages\\win32\\lib', 'C:\\Program Files (x86)\\Python36-32\\lib\\site-packages\\Pythonwin', 'C:\\Program Files\\JetBrains\\PyCharm 2018.1.1\\helpers\\pycharm_matplotlib_backend']
importlib 使用
结果: