Python模块

为什么需要模块?

大多数应用项目往往具有功能要求多、性能要求高的特点,由此导致的结果是使得程序代码复杂而且庞大。当程序代码多达几百行、几千行甚至上万行时,为了加快开发进度、提高开发效率,需要团队协作、分工合作开发程序。如果缺少有效的组织方式,那么不仅使得协同开发难以做到,而且程序的调试将变得异常艰难,后期的维护和升级更加困难重重。这时候就需要模块化。

模块分类

1.大模块

大模块即“包(Package)”。
一个相对大型的程序通常包含多个文件,按照功能相近的原则,可将这些文件分组,每组包含若干个文件,每个组常被称为“包”。每个“包”即所谓的“大模块”。

2.中模块

中模块即一个文件。
为了提高代码的可维护性,可将项目中的所有自定义函数进行归类分组,以文件形式组织同类函数,因此,每个文件的功能相对单一,每个文件包含的代码相对较少。这对项目管理和代码的重复利用十分有利。多数计算机语言均支持类似的组织代码方式,Python也不例外。在Python中,一个.py文件常被称为一个模块(Module)

3.小模块

模块即一个函数。
函数也是模块化设计的产物,通过函数实现程序功能是模块化设计思想的一种很好的体现。一个模块文件通常是由若干个函数或类组成的。

关于模块的几个概念

模块具有层次性,因此模块又可被分为内置函数、内置模块、第三方模块和自定义模块。
内置函数是Python的标准函数,可被直接调用。
内置模块是Python的标准库,必须通过import语句引用后才可使用。内置模块文件默认安装在Python的“安装路径\Python\PythonXXX\lib”下,即安装在lib文件夹下。
第三方模块是指由第三方开发的、实现各种特定功能的模块,又被称为“第三方库”。数量众多的第三方库是Python优越性的重要体现。
自定义模块是指由开发者自行设计的模块

关于模块测试

由if语句组织相关的测试代码,它的工作原理是:当运行模块文件本身时,Python解释器将特殊变量(内置全局变量)name__的值置为字符串__main__,因此__name==’main‘成立;如果该模块被其他程序所引用,那么__name__的值会被置为引用它的程序文件名(不包括.py),此时,name==’main‘不再成立,所以测试语句块不会被执行。因此,模块中的测试代码只用于测试模块本身的正确性,不会对引用它的模块造成影响。

引入模块的四种方式

第一种

引用一个名为fibonacci的模块,该模块的文件名为fibonacci.py。
再如:
上述语句引用3个名为fibonacci、geometric、arithmetic的模块,3个模块对应的文件名为fibonacci.py、geometric.py和arithmetic.py。
由此可见,import可一次性导入多个模块,模块之间必须以“,”隔开。

第二种

形式如下:
由于别名往往比较简洁,因而引用模块中的对象和方法更加便捷。当采用此方式引用模块中的对象或方法时,必须使用别名。

第三种

引用模块的第三种方式
形式如下:
从模块中导入指定的函数、变量或类,可对导入的对象或方法(函数)指定别名以简化引用

在这种方式下,引用模块中的对象或方法(函数)的形式必须是“模块.对象或方法的别名”,例如,geometric.geo1(2,3,6)。

第四种

导入模块中的所有对象和方法(函数)。“*”被称为“通配符”,意为全部、所有。
虽然方式四可一次性导入模块中的所有对象和方法(函数),但是通常不建议这么做,因为它极有可能引起命名冲突(Name Conflict),即该模块中的对象名或函数名与被导入的其他模块中的对象名或函数名重名,从而导致冲突。

模块是如何被找到并引用的

sys.path通常由以下几部分组成:
(1)脚本文件所在的路径,即当前路径。
(2)PYTHONPATH系统变量设定的路径。
(3)默认安装路径。

动态修改sys.path

通过sys.path.append(‘路径’)添加所需路径,它属于一种动态修改sys.path的方法。所谓“动态”,是指程序退出后,将删除添加的路径信息,恢复sys.path的内容

静态修改sys.path

可通过以下两种方式静态修改sys.path:
· 在系统环境变量中新建变量PYTHONPATH,然后添加所需路径,即PYTHONPATH =e:\myprj。
· 直接在Path系统环境变量中添加所需路径,即Path=[各种路径]; e:\myprj,或者Path=%PATH%; e:\myprj。前者表示在现有各种路径后添加所需路径,后者表示在Path变量现有值的基础上添加一项新的内容e:\myprj。上述两种方法均以“;”作为分隔符。
通过静态修改法添加的路径是静态的,永久有效

实战

同级目录文件

目录结构:

1
2
|-- love.py
|-- me.py

me中引用:

1
2
import love
love.min()

子级目录文件

目录结构:

1
2
3
|-- yep
--fuck
|-- me.py

me中引用:

1
2
from yep import fuck
fuck.fuckyou()