模块(modue)和包(package)的概念-import导入模块

 

模块html

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

为了编写可维护的代码,咱们把不少函数分组,分别放到不一样的文件里,这样,每一个文件包含的代码就相对较少,不少编程语言都采用这种组织代码的方式。在Python中,一个.py文件就称之为一个模块(Module)。web

使用模块有什么好处?ajax

最大的好处是大大提升了代码的可维护性。编程

其次,编写代码没必要从零开始。当一个模块编写完毕,就能够被其余地方引用。咱们在编写程序的时候,也常常引用其余模块,包括Python内置的模块和来自第三方的模块。dom

因此,模块一共三种:编程语言

  • python标准库
  • 第三方模块
  • 应用程序自定义模块

另外,使用模块还能够避免函数名和变量名冲突。相同名字的函数和变量彻底能够分别存在不一样的模块中,所以,咱们本身在编写模块时,没必要考虑名字会与其余模块冲突。可是也要注意,尽可能不要与内置函数名字冲突。函数

 

 

包(package)

 

一般包老是一个目录,可使用import导入包,或者from + import来导入包中的部分模块。包目录下为首的一个文件即是 __init__.py。而后是一些模块文件和子目录,假如子目录中也有 __init__.py 那么它就是这个包的子包了。(若是__init__文件,python 2是不支持导入的,可是测试python 3支持)post

 

原来在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 使用

 

结果: