当前位置:首页>python>《Python 从入门到精通》081|模块是什么:为什么 Python 代码可以拆文件

《Python 从入门到精通》081|模块是什么:为什么 Python 代码可以拆文件

  • 2026-10-11 07:13:05
《Python 从入门到精通》081|模块是什么:为什么 Python 代码可以拆文件
今日分享:

不要盯着问题,而是盯紧目标; 不做解决问题的高手,而是做达成目标的强者!

前面我们已经一路学到了函数、文件、异常、面向对象。到这里,很多人都会慢慢碰到一个新问题:

代码一开始只有几行的时候,写在一个 .py 文件里当然没问题。 可当代码越来越多,函数越来越多,类越来越多,文件越来越长时,整份代码就会越来越难看、越来越难找、越来越难维护。

比如你可能会遇到这种情况:

上面是用户管理函数 中间是文件处理函数 下面是图书类 再往后又是一些工具函数 最后还有一大段程序入口代码

一整个文件从头滚到尾,自己看着都累。

这时候,模块就该出场了。

这一章,我们就把一个非常重要的能力讲清楚:

为什么 Python 代码可以拆成多个文件,以及模块到底是什么。

你会发现,学会模块以后,代码会第一次真正开始有“项目结构”的感觉。

一、先说结论:模块其实就是 Python 文件

先给你一个最直接、最够用的结论:

一个 .py 文件,通常就可以看作一个模块。

比如你有一个文件叫:

tools.py

那这个 tools.py,本身就可以被当成一个模块来使用。

再比如:

user.pybook.pymath_utils.pyconfig.py

它们每一个,都可以是一个模块。

所以模块这个词,初学时不要想得太玄。 你先把它理解成:

为了让代码更清楚,我们把相关代码单独放进一个 Python 文件,这个文件就叫模块。

这样理解,基本就顺了。

二、为什么代码一定会走到“要拆文件”这一步

这是一个非常现实的问题。

很多初学者前期写的程序都比较短,一个文件几十行,甚至十几行,当然不觉得拆文件有必要。 但只要你继续往后学,代码量一定会上来。

比如你做一个小项目,里面可能会有:

数据处理函数 日志函数 工具函数 配置项 多个类 主程序入口

如果这些东西全堆在一个文件里,会出现几个明显问题。

第一,不好找。 你想改个工具函数,得在一大堆代码里翻半天。

第二,不好分工。 如果以后和别人协作,所有人都改一个文件,冲突会非常多。

第三,不好复用。 有些工具函数本来别的地方也想用,但现在都和主程序糊在一起了。

第四,不好维护。 代码一长,你脑子里就很难快速建立清晰结构。

所以代码拆文件,不是什么“高级技巧”,而是代码一多之后的自然需求。

三、模块本质上是在做什么

模块最核心的作用,其实只有一句话:

把相关代码组织到一个独立文件里,方便复用和管理。

比如你可以这样想。

数学相关函数,放到一个文件里。 用户相关类,放到一个文件里。 图书相关类,放到一个文件里。 程序入口,单独放到一个文件里。

这样做的结果是什么?

谁负责什么,一下就清楚了。

所以模块本质上不是“多学一个语法”,而是在学代码组织方式。

前面我们说过:

函数更擅长组织步骤 类更擅长组织角色

那到了这一章,你可以再加一句:

模块更擅长组织文件层面的结构。

四、先看一个不用模块时的尴尬场景

假设你现在写了两个函数:

defadd(a, b):return a + bdefsub(a, b):return a - b

一开始你把它们写在主程序里,没问题。

但后来你又写了:

用户登录函数 成绩统计函数 文件读取函数 日志打印函数

整个文件越来越长。

这时如果你还不拆,后果就是:

所有逻辑混在一起 工具函数和业务逻辑混在一起 主程序入口和底层能力混在一起

这时候你会明显感觉到:

不是代码不能跑,而是结构开始变乱了。

而模块,就是在帮你把这种乱局重新整理清楚。

五、模块最直接的好处:分工明确

比如你可以把数学工具单独写进一个文件 my_math.py:

defadd(a, b):return a + bdefsub(a, b):return a - b

然后主程序里只保留核心流程,不再把所有函数都堆在一起。

这样一来,my_math.py 这个文件一看就知道是干什么的。 以后谁想改数学工具,直接进这个文件。 谁想看主流程,去主程序文件。

这就是模块带来的第一层清晰感:

一个文件,专注一类事情。

这个思想特别重要。

因为后面你会发现,真正“像样的代码”通常都有这种结构意识。

六、模块不仅是为了整理,更是为了复用

这是第二个非常重要的价值。

如果一个文件里的代码写得足够独立,那它以后就不只是“这个项目的一部分”,而是可以被别的地方继续用。

比如你写了一个 string_tools.py,里面放的是字符串处理函数。 以后你做别的项目时,照样可以导入它。

这就是模块的复用价值。

前面学函数时,我们已经知道函数能复用逻辑。 现在模块更进一步:

把一组能复用的函数、类、常量,整体打包到一个文件里复用。

这会让代码越来越像“积木”,而不是每次都从零重写。

七、模块里通常会放什么

初学阶段,你可以把模块里常见内容分成四类。

函数 类 变量或常量 少量初始化代码

比如一个模块里可能会有:

PI = 3.14159defadd(a, b):return a + bclassCalculator:    ...

也就是说,模块不是只能放函数。 类也可以放,变量也可以放。

你甚至可以简单理解成:

一个模块,就是一个承载代码内容的独立 Python 文件。

只要这些内容逻辑上属于一类,就适合放在同一个模块里。

八、模块和类,不是一个层面的东西

这里很容易混,必须单独说一下。

很多新手学到这里,会把模块和类混成一层。其实不是。

类,是文件里面定义的一种结构。 模块,是装这些代码的文件本身。

比如你有一个文件叫:

book.py

这个文件是一个模块。 而文件里可以定义一个:

classBook:    ...

这里 Book 是类,不是模块。

你可以这样记:

类,是文件里的角色。 模块,是文件本身。

把这层关系分清,后面学导入时才不会乱。

九、先看一个特别小的模块例子

假设我们有一个文件叫 my_tools.py,内容如下:

defgreet(name):    print(f'你好,{name}')defsquare(num):return num * num

这里的 my_tools.py,就是一个模块。

它里面放了两个函数:

greet()square()

那接下来主程序就可以不用自己再写一遍,而是直接使用这个模块里的能力。

你现在先不要急着问具体导入语法,下一章我们会系统讲。 这一章你先把“模块就是独立 Python 文件”这个感觉建立起来最重要。

十、为什么说模块是从“练习代码”走向“项目代码”的分水岭

这句话你可以重点记一下。

刚开始写练习时,所有代码塞一个文件问题不大。 因为练习本来就短,也不会特别追求结构。

但一旦开始写稍微像样一点的小项目,你就会发现:

不拆模块,几乎一定会乱。

所以从某种意义上说,学模块就是在学一件事:

代码不再只是为了能跑,还要开始讲究结构。

这和前面学函数、学类是一个方向。

函数让你不再把重复流程到处抄。 类让你不再把角色信息写得散乱。 模块则让你不再把所有代码都堆在同一个文件。

这其实就是编程能力一步步升级的过程。

十一、模块和“命名”关系非常大

因为一个模块本质上就是一个文件,而文件名会直接影响阅读体验。

比如你看到:

math_utils.pyuser_service.pybook.pyconfig.py

大概一眼就知道各自用途。

但如果一个项目里到处都是:

test1.pydemo2.pyabc.pymyfile.py

那看的人会特别痛苦。

所以从模块这一章开始,你要慢慢建立一个意识:

文件名本身也是代码设计的一部分。

模块名尽量要做到:

简洁 清晰 表达内容用途

不要乱起。

因为一个项目写到后面,你找代码时,很多时候第一步就是先看模块名。

十二、模块其实也在推动“高内聚”

前面我们讲封装时,提到过“高内聚、低耦合”这个味道。现在模块这章,你会再次碰到同样的思路。

高内聚的意思是:相关的东西尽量放在一起。

比如:

字符串处理函数放一起 图书类和图书相关逻辑放一起 配置项放一起 用户相关逻辑放一起

这其实就是模块在做的事。

所以模块并不是孤立知识点,它和前面学过的设计思想是一致的。

本质上都在做同一件事:

让相关代码待在该待的位置。

这会直接提升可读性和可维护性。

十三、一个更贴近前面项目的例子

前一章我们做了一个图书借阅系统。

如果继续全部写在一个文件里,当然也能跑。 但如果你稍微把项目往真实一点的方向推进,就很适合拆成模块。

比如可以拆成这样:

book.py放 Book、PaperBook、EBook

user.py放 User

library.py放 Library

main.py放程序入口和运行代码

你会发现,一旦这么拆,项目立刻就像样很多。

谁负责图书 谁负责用户 谁负责图书馆逻辑 谁负责主程序入口

全都很清楚。

这就是模块的项目价值。

十四、为什么说“可以拆文件”本身就是一种能力

因为很多初学者虽然知道一个项目能有多个文件,但真正轮到自己写时,脑子里并没有结构意识。 结果就是所有代码还是会本能地往一个文件里堆。

能不能拆文件,不在于你知不知道有多个 .py 文件这回事,而在于你能不能判断:

哪些代码应该放一起 哪些代码应该分开 模块边界应该怎么划

这其实已经是工程化思维的雏形了。

比如你看到一个类越来越大,里面塞了很多不属于它的工具函数,这时候就应该开始警觉: 是不是有些东西应该拆去别的模块了。

所以模块这一章看起来是在讲文件,实际上是在训练结构感。

十五、模块不是拆得越碎越好

这也要提前提醒你。

有些人一学会模块,就很容易走向另一个极端:恨不得一个函数一个文件。 这样也不对。

模块拆分的目标是清晰,而不是碎片化。

如果你把关系很紧密的内容拆得太散,反而会增加跳转成本,弄得项目东一块西一块。

所以更好的原则是:

逻辑上高度相关的内容放在一起。逻辑上职责不同的内容再分开。

比如图书类和图书工具,可能放一起没问题。 但图书和用户通常就不适合硬塞一个文件里。

所以模块拆分也不是死规则,而是一种平衡。

十六、模块还有一个隐含好处:更方便测试

这个点现在先有个概念就够了。

如果你的代码全堆在一个大文件里,想单独验证某一部分逻辑会比较麻烦。 但如果功能已经拆成独立模块,你就可以更容易地单独测试和复用它。

比如你想验证 book.py 里的某个方法,或者 math_utils.py 里的某个函数,就不需要把整个主程序都跑起来。

这对后面学测试、学工程化非常重要。

所以模块不只是为了“看起来整齐”,它也会直接影响开发效率。

十七、现在你可以把模块理解成“文件级封装”

这个说法特别好记。

前面我们说类是在做对象级封装。 函数是在做流程级封装。

那模块其实可以理解成:

文件级封装。

你把一批相关代码装进一个文件里,对外提供可使用的内容。 外部不必知道这个文件内部是怎么组织的,只需要知道它能提供什么能力。

这样一串起来,模块这件事就不再孤零零了。

你会发现,它其实只是封装思想往更大一级继续延伸。

十八、一个很常见的误区:以为模块只是为了“让代码能 import”

这当然是模块的一个用途,但不是全部。

很多人一提模块,就只想到导入:

import xxx

这没错,下一章也会重点讲。 但如果你只把模块理解成“为了 import 才存在”,就太窄了。

模块更本质的价值是:

整理代码 划分职责 减少混乱 促进复用 支持项目结构成长

导入只是模块被使用时的一种手段。 不是模块存在的全部意义。

十九、本章小练习

你可以做两个很适合入门的练习。

第一个练习:

把你之前写过的数学函数,比如 add()、sub()、mul()、div(),单独整理到一个新文件里,文件名就叫 my_math.py。

第二个练习:

把你前面写过的 Book 类或者 Student 类,单独放到一个新文件里。 主程序先只保留创建对象和调用方法的部分。

你暂时不用追求写得多复杂。 重点是亲手感受一下:

当代码拆到不同文件里后,结构是不是立刻清楚了很多。

这一点,只有自己动手拆一次,感觉才会特别明显。

二十、本章总结

这一章最重要的,不是学会某一条导入语句,而是先把模块的直觉建立起来。

模块,本质上就是一个独立的 Python 文件。 代码之所以要拆文件,是因为项目一旦变大,所有内容堆在一个文件里会越来越难维护。 模块的核心价值,是整理代码、划分职责、支持复用。 函数是在组织步骤,类是在组织角色,模块是在组织文件层面的结构。 模块不是越碎越好,而是要按逻辑职责合理拆分。 学会模块,意味着你的代码开始从“练习式写法”走向“更像正式项目的写法”。

下一章我们继续往前走,正式进入最常见的导入话题:082|import 的几种写法,到底应该怎么用。

最新文章

随机文章