模块

在计算机程序的开发过程中,随着程序代码越写越多,在一个文件里代码就会越来越长,越来越不容易维护。

为了编写可维护的代码,我们把很多函数分组,分别放到不同的文件里,这样,每个文件包含的代码就相对较少,很多编程语言都采用这种组织代码的方式。在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的模块。

 

现在,假设我们的abcxyz这两个模块名字与其他模块冲突了,于是我们可以通过包来组织模块,避免冲突。方法是选择一个顶层包名:引入了包以后,只要顶层的包名不与别人冲突,那所有模块都不会与别人冲突

 

列:

 

有个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)

执行结果:

 

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

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 使用

 

结果:

 

posted on 2018-06-13 17:56  Python哥  阅读(1245)  评论(0编辑  收藏  举报