python成长之路14——模块和包

一. 什么是模块和包

     1.在开发过程中,为了使得我们的代码的可维护性和重用性更好,将很多函数按功能进行分组,分别放到不同的文件里,这些文件就叫作模块,一个.py文件就是一个模块(Module)

     2.使用模块可以避免函数名和变量名的冲突,但是我们在写模块的时候要尽量别与内置模块名字冲突,下一篇我们详细说几个常用的内置模块。

     3.模块可以分为:内置模块,第三方模块,自定义模块三种。

     4.模块的概念不只是python有,所有语言都有这个概念,只是名字可能不一样,在别的语言里叫作“类库”。

     5.你也许会想到,不同的人如果编写的模块名相同怎么办?为了避免模块名冲突,python又引入了按目录来组织模块的方法,称为包(Package)。引入包以后,只要顶层的包名不与别人冲突,那所有的模块都不会与别人冲突。

     6.怎么样就是一个包了呢?包就是一个目录吗?你可能会有这样的疑问。下面我们就聊聊他们的区别。包是一个目录,但是它也有别于目录,只有具有__init__.py文件的目录才能称之为包

二. 模块和包的导入

     上面我们已经了解了模块和包的概念和对开发带来的便利了,大家是不是很想立即使用他们呢,要使用就需要先导入。那么怎么导入模块和包呢?

     只要模块或者包所在目录在sys.path中,就可以使用以下几种方式实现模块的导入:

   (1)from 模块  import  函数
   (2)from  包.包   import  模块
   (3)from 包. 模块   import  函数
   (4)import 模块  as  别名
     
     需要注意的点:
   (1)如果要导入的模块和当前模块在同一目录,直接import此模块就可以
   (2)如果要导入的模块和当前模块不在同一目录,要导入模块在别的包里,就需要将要导入模块所在的目录(此目录不需要必须是包),或者其包所在的目录(此目录不需要必须是包)加入到sys.path列表里就可以用上面的4种方式进行导入啦
   (3)为了考虑到代码的可移植性,我们在加入sys.path列表时不能直接写当前编辑代码的目录的绝对路径,所以要用到os.path.abspath(程序的相对路径)
 1 #目录结构如下
 2 # m_p----|
 3 #        |---p1---|
 4 #        |        |---__init__.py
 5 #        |        |---common.py
 6 #        |
 7 #        |---p2---|
 8 #        |        |---__init__.py
 9 #        |        |---common.py
10 #        |
11 #        |---test.py
12 
13 #要求:我要在test.py里导入p1和p2的common,分别执行输出p1和p2的功能
14 #分析:要导入p1和p2 必须要求p1和p2所在的目录在sys.path的列表里,我们知道test.py的#sys.path里是包含其父目录的,所以可以直接导入p1和p2
15 #保险起见,我们可以确定下是否包含:
16 #test.py:
17 import sys
18 for i in sys.path:
19     print(i)
20 
21 执行结果:
22 /Users/admin/stu179471/day3/m_p
23 。。。。。
24 
25 #可以看出,是可以直接导入p1和p2的,因为他们的父目录m_p在sys.path里
26 #p1-common.py:
27 def f1():
28     print("p1.common.f1")
29 #p2-common.py:
30 def f1():
31     print("p2.common.f1")
32 #test.py:
33 from p1.common import f1 as p1_f1
34 from p2.common import f1 as p2_f1
35 
36 p1_f1()
37 p2_f1()
38 
39 执行结果:
40 p1.common.f1
41 p2.common.f1
42 
43 #上面是包的父目录在sys.path目录里的,下面我们看个导入外部包的
44 #新的目录结构为:p1和p_m同级目录,他们的父目录为day3
45 
46 for i in sys.path:
47     if "day3" in i:
48         print(i)
49 
50 执行结果:
51 /Users/admin/stu179471/day3/m_p
52 
53 #发现没有目录day3,将其添加到sys.path里
54 import sys,os
55 sys.path.append(os.path.dirname(os.path.dirname(os.path.abspath(__file__))))
56 
57 for i in sys.path:
58     if "day3" in i:
59         print(i)
60 
61 执行结果:
62 /Users/admin/stu179471/day3/m_p
63 /Users/admin/stu179471/day3
64 
65 #这样就可以导入并使用p1啦
66 import sys,os
67 sys.path.append(os.path.dirname(os.path.dirname(os.path.abspath(__file__))))
68 
69 from p1.common import f1
70 
71 f1()
72 
73 执行结果:
74 p1.common.f1
例子

三. 第三方模块的使用

      要使用第三方模块,首先要安装。

  安装有两种方式:

    (1)pip3/pip  python2需要先安装pip,python3自带pip3   

  (2)源码安装  下载下源码之后,到源码目录里执行 python3 setup.py install

     安装完成之后,我们就可以导入使用啦。 

 

posted @ 2017-02-28 15:17  meitangyanyan  阅读(162)  评论(0编辑  收藏  举报