八 Python 玩转模块,和文件的引用

目录

1 模块的概念

2 import

3 与 import 使用时机的若干问题

4 from...import...


到目前为止,之前的代码都是写在一个文件里面(*.py),任何一个小的软件可能它都需要上万行代码,我们可以把这些代码写到一个文件里面,在里面做调试和改进,这完全是行得通的。但如果我们是团队开发,一个小伙伴在修改BUG、另外一个小伙伴在改进原有功能、其他小伙伴在新加功能。那么就会引发很多冲突。

【配图,引发冲突的图片】

还有些软件的规模比较大、比如我们的操作系统、或者某款游戏,代码量通常都在千万行级别,如果还用一个文件来存放这些代码,那无论是维护这块软件、还是管理这款软件的代码都会成问题,就算打开这个代码文件可能都需要几个小时的时间,因为这个文件已经很大了, 这样是效率极其低下的。因此,由多个文件来组成一个软件的源码是最理想的状态。

1 模块的概念

模块可以理解成一个系统的组成部分,并且它承担着整个系统的部分功能。比如我们的心脏、大脑、肝脏、肺都可以是为我们身体里的模块,它有单独的功能,比如肺负责呼吸,这些模块组合在一起就形成了完整的人。

在Python里,一个文件就被视为一个模块。一个成熟的系统是由多个模块来组成的,也可以说成一个成熟的系统是由多个文件组成的。大部分开发语言都遵循这样的约定。在Python里单独的模块它不能构成一个系统,模块们要组合在一起、连接在一起才能构成整个系统,让系统正常的运转。那我们要如何在一个模块里,使用(链接)另外一个模块的内容呢? Python给我们提供了两组关键字。

2 import

我们还是基于 “做菜” 的代码来看看这些例子:

img

我们新建了一个文件(也可以理解成模块),它叫 wash.py。在这个文件里面,我们编写了两个函数,wash_food、wash_bowls,这两个函数使我们通过函数拆解代码时候的例子。我们在创建一个文件,cook.py,它的代码如下:

img

  1. 第2行代码,我们使用了Python的 import 这个关键字,把wash这模块,其实就是wash.py这个文件导入到了cook.py里面,让我们在cook.py这个文件里可以使用wash.py文件里的函数或者变量等。

  2. 第12,15行我们通过 wash.XXX 的模式使用了 wash.py 里面的方法。好奇的小伙伴会问,为啥不能直接用,比如 wash_bowls() 这样用呢? 因为这是Python的一种机制,避免两个文件相同变量或函数的冲突,所以用文件名来做了个前缀。(通过 from .... Import 可以)

上面的例子展示了如何用 import 这个关键字 让一个文件使用另外一个文件里的函数。import 使用起来确实很简单但 import 的使用有很多细节值得我们注意。

import 是如何寻找到 wash.py 这个文件的位置的?

当Python解释器遇到 import wash 时,Python 会在自己默认的搜索路径里列表里寻找 wash.py 文件,如果找到了,就可以使用 wash 里面的内容,如果没找到在运行代码的时 Python 会给我们提示。那 Python 默认的搜索路径有哪些呢? 我们可以通过代码来查看:

img

  1. 第1行代码,导入了 python 内置的 sys模块。

  2. 第2行代码,把 sys 模块里的 path 变量赋值给 path_list 这个变量。

  3. 第6~7行遍历这个path_list

我们看一下这段代码执行后的结果:

img

上面就是 import 默认的检索路径。上面代码的 sys 模块就在 “C:\Python\Python39\lib” 路径下面。wash.py 文件就在 “C:\python_learn\welcome come to my word\test\section_4\class_9_1” 路径下面。

img

那我们是否能添加一些路径在默认路径里,方便 import 找到某些模块呢 ? 这个当然可以,看下面代码:

img

  1. 第3行代码,我们给 sys.path 这个列表,添加了 “d:/” 这个默认路径。

  2. 第8~9行,我们遍历了默认路径。

我们来看代码执行的结果:

img

“d:/” 这个路径被我们加入到了 import 默认搜索路径里,意味着在这个文件里,我们可以通过 import 关键字导入 "d:/" 这个目录下的各种模块了。

3 与 import 使用时机的若干问题

我们在上面的例子可以看到 import 通常是放在一个文件里的最上面,但其实我们只要把它放在需要调用外部文件代码之前就可以,看下面例子:

img

看第12行代码,我们在使用 wash 之前导入了 wash 这个模块。

在我们维护的模块多了以后,特别是多人开发的时候,同一个文件,同时,不同地方,导入相同的模块这种情况是会发生的,比如:

img

按照规范,外部文件导入一次就可以了,但若粗心多次导入了同一个文件并不会引起什么不妥,无非就是多了几行代码而已。Python 在解析代码的时,会留意这些重复导入的外部文件语句,Python会将第一次 import 语句要导入的外部文件导入进来,忽略第二次、第三次相同的导入语句,也就是说无论你导入了几次相同的外部文件,Python仅只会导入一次。

还有的时候我们会遇到这样的问题,A模块导入了B模块,同时B模块也导入了A模块,这个时候Python就会提醒开发人员,代码里发生了 循环导入 的问题。这种 “先有鸡还是先有蛋” 的问题,我们自己都没搞清楚,Python肯定也是搞不定的。

所以,在代码相互导入的时候,我们要特别注意 循环导入的问题。

4 from...import...

我当时在学习 import 的时候,就在想有没有什么方式导入文件不依赖于 import 按照默认目录去寻找,而是直接指明外部文件的位置的? 这个方法确实有,并且它的使用频率和 import 都差不多,这就是 from...import...。

我们直接来看例子:

img

  1. 第1行代码,通过 from...import 的方式来导入外部文件。我们会发现这样的方式更具有语义化。第一行代码我们可以这样翻译,“从 wash 这个模块里,导入 wash_food,wash_bowls 这两个函数”。

  2. 第12,15行代码,我们直接调用这两个函数,并且无需再用前缀。

这样的导入方式,能让我们导入的更精准,要用什么导入什么,而不是整个文件的导入。如果我们想用这样的方式,一次倒入一个外部文件的所有内容(函数、变量等等),我们可以尝试这样做:

img

我们甚至可以把导入的函数换一个名字,看下面代码:

img

在第2行里面,我们通过 as 这个关键词 给函数取了一个别名,然后在第12,15行代码里用别名调用了函数。as 可以给函数取别名、也可以给任何对象趣别名。from...import 和 import 一样存在循环导入、重复导入、导入位置的问题,但Python处理它们的方式和处理 import 的一样。

以上就是 from...import 的用法,后面我们讲到 “如何站在巨人肩膀上” 的时候,会有更多 import 与 from...import 的例子,但是现在我们要来学习任何一个软件开发语言里都会有的重要概念,它是构建一个软件的思想基础、也是Python这门优秀语言的根基。

它会带你从另外一个角度来看到我们的世界!

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

深思熟虑的羽毛球

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值