
引言
上周发表了《老胡讲Python》系列第一篇,得到了很多的关注。在第一篇中,大家表示对模块不是很明白,而模块的概念在Python中是十分重要的,于是今天带来《老胡讲Python》系列第二篇之《深入浅出Python模块》。
模块是干什么的
所谓模块,首先它是一个.py文件,其次这个文件里面是一系列类和方法的集合。通过合理地把代码组织到不同的模块,可以使得Python项目结构清晰,便于维护。举个例子,如果我们把电脑主机比作一个Python项目,那么主机里的内存,CPU,显卡等就是一个个独立的模块,把这些东西独立地分开来,而不是揉在一起,有利于维护和拓展。比如你想升级内存了,只要换根内存就可以了;而你想把显卡给其他主机用,只要把显卡拔下来,插到其他主机就可以了。如果不区分模块,一切都揉在一起,那么显然要换就要全换了。而如何把代码合理地组织到不同的模块,这个不是一蹴而就的,需要项目经验的积累。我的建议是,做项目时,先不要过分关注模块的组织是不是合理,先动起手来写代码,在写的过程中,会遇到代码重复或者单个文件里代码行数过多等问题,这时候自然而然会想到把代码抽离到不同的模块中。记住一句话,合理的模块是不断改出来的。
模块的导入
Python的模块导入有相对导入,绝对导入,添加系统变量这几种方式,每种方式各有优缺点,我推荐绝对导入的方式,因为它简单易记,不容易搞混。绝对导入有两个要点:
1. 确定入口文件(即程序运行时用python命令执行的那个文件)。
2. 所有文件中的模块导入以入口文件为根路径开始计算。
下面举一个绝对导入的例子(其他导入方式,大家可以到网上搜索)。项目结构是这样的(注意,如果是python2运行,pkg1, pkg2, pkg3中都要添加__init__.py文件):

示例项目
1. 入口文件为index.py
2. 导入同级目录的模块,
比如module2.py中导入module1: from pkg1 import module1.
3. 导入父级目录的模块
比如module5.py中导入module3 from pkg2 import module3
4. 导入不同级目录的模块
比如module2.py中导入module3和module5 from pkg2 import module3 from pkg2.pkg3 import module5
模块方法调用
调用模块方法有静态调用和动态调用两种方式,我们假设module1.py中有个方法hello_module()
静态调用:
module1.hello_module()
动态调用:
getattr(module1, ‘hello_module’)()
静态调用的方式很常见,与C++, Java等很类似,动态调用是Python等脚本语言才有的功能。动态调用会带来很多写法上的便利,比如实现一个简单的加减法计算器,用户输入‘+’号时,调用add函数,用户输入‘-’时,调用minus函数,传统的写法是这样的(伪代码):
#导入模块Calculation if '+' == input: Calculation.add() if '-' == input: Calcualtion.minus()
而动态调用,则可以这样写:
#导入模块Calculation
oper = {'+': 'add', '-': 'minus'}
getattr(Calculation, oper[input])()
随着操作方式的增加(比如乘法,除法,开方等),后一种写法的简洁性会淋漓尽致地体现出来,这就是Python的优美。
结束语
Python第二课就讲到这里了,主要有三个知识点:
1. 模块的概念。
2. 模块怎么样绝对导入。
3. 模块方法的调用。
大家有任何疑问或者建议,欢迎给我留言,让我们一起学习,一起提高:D