老师,我编写的Python代码越来越多了,怎么组织代码比较好呢?
很好的问题!Python提供了模块(Module)和包(Package)来组织代码,使项目更结构化。
什么是模块啊?
模块是一个包含变量、函数等的.py文件。导入模块后可以访问其内容。
听起来很方便!包又是什么呢?
包是一个包含模块的文件夹。导入包内模块需要使用点号,如package.module。
我明白了!使用模块和包可以把相关代码分组,方便管理。
没错!合理的代码组织可以使复杂项目更易维护。要养成编写可重用模块的习惯。
明白了!我会努力学习利用模块和包组织代码。
Python语句通过模块(Module)和包(Package)管理和组织代码。
模块是保存代码的最小单位,一个文件Python就是一个模块。模块中可以声明变量、常量、函数、属性和类等Python程序元素。一个模块提供可以访问另外一个模块中程序的元素。
模块的命名规范:( 1 )使用简短的全小写英文字母;( 2 )为了提高可读性可以使用下画线;( 3 )避免与Python内置模块名相同。
下面通过示例介绍模块的使用。现有两个模块——module1和module2,两个模块中都声明相同名字的变量Money。
module1.py代码如下:
module2.py代码如下:
使用module1和module2中代码元素需要使用import语句实现。例如,在main.py文件中访问module1和module2模块中Money变量的示例代码如下:
上述代码执行结果如下所示。
为了访问其他模块子代码,不仅需要在模块一开始使用import语句引入模块,而且要在使用其他模块中的代码元素时加前缀“模块名+.”访问。
如果觉得这样比较麻烦,可以使用from<模块名> import实现。main2.py示例代码如下:
上述第①处是引入module1中的xyz变量,如果需要引入所有代码元素,可以使用(*)号,见代码第②处。
使用了from<模块名> import语句引入后,访问代码元素时可以省略“模块名+.”前缀,但是要注意不同模块中相同名字代码元素的冲突问题,例如代码第③处访问的Money变量还是当前模块中的Money变量。
如果两个模块名字相同,如何防止命名冲突呢?那就是使用包,包本质上是一种命名空间。
包的命名规范与模块相同。
包本质上是一个文件夹,但是该文件夹下面会有一个__init__.py文件(注意init前后分别是双下画线),该文件内容是空的,作用是告诉Python解释器该文件夹是一个包。例如在项目中创建pkg2和pkg1两个包,图2-2所示是包的层次结构。
图2-2 包的层次结构
包创建好后,将两个模块hello放到不同的包pkg1和pkg2中,如图2-3所示。
图2-3 包中的模块
为了访问包中的代码元素,需要使用import语句导入包中的代码元素。
pkg1的hello模块代码:
调用hello模块代码:
上述代码执行结果如下所示。