GV

GeezerVison

The World Wide Web, restored to 800 pixels of glory.

Home|About|Gaming cabinet|Archives|How it works|Starter sites

On this site

  • 莫烦PYTHON
  • 学习 ▾
  • 推荐学习顺序
  • 交互式学Python
  • 多进程 multiprocessing
  • 多线程 threading
  • 窗口视窗 Tkinter
  • 有趣的机器学习
  • 强化学习 Reinforcement Learning
  • 进化算法 Evolutionary Algorithm
  • Tensorflow
  • PyTorch
  • Theano
  • Keras

This view

  • Original page
  • New address

GeezerVison is showing mofanpy.com — Module 模块 | 莫烦Python

  • 支持

📢

莫烦有新起点啦!「莫烦 x 无限可能」— 关于 AI、行业、产品、教育的经验思考,欢迎来新站看看 →

« Class 类 读写文件 »

Module 模块

作者: 莫烦 编辑: 莫烦 发布于: 2021-05-01

一般来说,如果你的工程在一个脚本文件中就能写完搞定,那么就不用搞module这种概念, module主要是为了一个相对比较大的工程,涉及到多个文件之间的互相调用关系。 如果一个文件写所有的代码可能成千上万行,阅读起来一点也不友善, 所以我们更长是将大项目的长代码拆开成多个模块,用文件夹和多文件的方式管理起来,方便后期维护。 这就有了 module 模块的程序代码管理方式。

我给大家先看一下,莫烦Python这个网页的一些代码架构吧,在做这个网页代码架构的时候,我无时无刻都使用这 module 模块的概念。

mofanpy

本次的练习代码,因为是在浏览器中演练的,所以有些操作还是和实际开发Python项目有偏差。 我会在具体有偏差的地方给大家说明。

文件中的代码¶

还是我们的大背景,如果我们要设定一个文件管理系统,这个系统中肯定有很多功能,有文件查找,文件修改,权限管理等等。 每一个可以被分类的功能都可以被放在特定的一个组里。我们就从最简单的module说起。

假设我写好了一些功能,这些功能可以被其他人使用。 我是直接给一段代码给别人使用呢,还是给一个Python文件?我还是喜欢给文件的,因为不管你写了什么代码, 你给我个文件,我对你的代码就无感知,我只需要按照功能从你的文件中调取出来特定功能就好了。 比如有人给了我一份 file.py 文件。这个文件里有 create_name() 的功能。

作为这个功能的使用者,我不关心你 create_name() 里面的代码是怎么实现的,我只关心我可以用 create_name() 这个功能就好。

注意,在这个教学中,我已经提前为了在你的浏览器里临时创建一个 file.py 文件,我们后面就可以调用起来了。 如果在你本地实验的话,也就相当于下面截图的意思。

file

引用 module¶

引用 module,我们通常也可以说成 引用库,引用包,引用代码 等。总之就是引用一份已经写好的代码。 创建好 file.py 后,相当于别人给了你一个可被调用的文件后,我们怎么引用呢?

当然,我们得有自己的一个 .py 文件,我就假设自己的这个Python文件叫做 me.py 吧。 所以你可以在同目录下,创建一个 me.py 并把这面这段代码写在你的 me.py 中。

me.py

你点运行,就会发现,它能打印出你在 file.py 里定义的那个 new_file.txt 名字,这就证明我们能成功引用之前写的功能了。 也就意味着,我们引用 file.py 这个文件的写法是 import file。 而调用 file.py 里的 create_name() 的写法是 file.create_name()。熟悉 Python Class 的同学可能会立马发现。 这里调用模块功能的时候和调用Python类功能更有异曲同工之处。甚至下面我们换一种方式,你会觉得更像了。

你看,这两种用法简直了!一模一样,当我给 file 重命名时, import file as f1,就和 f2 = File() 简直一模一样,他俩你目前可以想是等价的。 然后使用它们的 create_name() 功能呢的方式也一模一样。

长得像不是没有原因的,因为module的设计真的可以和class一模一样,我们在后面会继续讲到。

上面在写 import file as f1 无意间,我就透露了另一个知识点,你可以给模块重命名的。好,接下来我们再多说几种引用的方式。

如果你的 file.py 里面有多个函数,你也可以一起写在 import 里。

如果函数真的很多,而且你也不想一一写出来,你可以有两种方式来达成简化的目的,前一种已经介绍了,后一种是新的方式。

大项目的模块管理¶

在稍微大点的项目中,随着代码量增加,代码管理起来越来越困难。很多时候我都不知道要去哪找代码。 所以优秀的代码框架,好的模块定义成了增加开发效率的关键。比如这个文件管理系统,我再做一个架构,搞一下功能分区。

complex

注意,这里用的依赖文件和文件夹,我也帮你提前悄悄在浏览器缓存中创建了。 对应到本地文件的结构的话,其实就和上面截图一致。

上面刚开始讲解的时候我们不是提了一嘴 module 和 class 很像嘛, 现在我们就来看看到底有多像。

正规的 module 中,我们常会看到一个 __init__.py 文件,这个文件其实就有点像 class 里的 def __init__(self), 你可以在里面写上要如何初始化你的 files 目录。也可以设定目录中个元素的关系。

我在 __init__.py 中写下了下面这段话,待会我们来演示一下这段话的作用。 注意,下面这段代码,你不要点击运行按钮。点击了会报错的。

设置好 __init__.py 后,我们就能直接从 files 里 import get_video_size 这个属于 video.py 的功能了。

但是和 video.py 同级的 text.py 就无法通过这种 import 方式获取到 text.py 的功能。

如果我们要获取到 text.py 的功能,我们得这样 import:

好了,更复杂的代码,有更复杂的结构,不过也都是一层层嵌套上面这样的做法。有了这些基础,我相信你遇到大项目的时候, 应该都能迎刃而解。


降低知识传递的门槛

莫烦经常从互联网上学习知识,开源分享的人是我学习的榜样。 他们的行为也改变了我对教育的态度: 降低知识传递的门槛。

我组建了微信群,欢迎大家加入,交流经验,提出问题,互相帮持。 扫码后,请一定备注"莫烦",否则我不会同意你的入群申请。

wechat
« Class 类 读写文件 »
    教程目录

    交互式学Python

      介绍

    • 课程介绍

      基础功能

    • 变量与运算

      循环、数据、判断

    • 条件判断
    • for 和 while 循环
    • 数据种类

      函数、类、模块

    • Function 函数
    • Class 类
    • Module 模块
      • 文件中的代码
      • 引用 module
      • 大项目的模块管理

      文件管理

    • 读写文件
    • 文件目录管理
    • 正则表达式
    • pickle/json 序列化

      异常检查和处理

    • 如何控制异常 try-except
    • 单元测试

      做个项目

    • 没啥用计算器
    • 文件批量处理

      高阶内容

    • 字符串的高级玩法
    • Python的偷懒用法
    • 复制的"玄学"
    • 为什么要有生成器
    • 套娃的装饰器
    • Python 安装和依赖管理:Conda/Pip
    • Python编辑器

      进阶学习

    • 多线程多进程
    • Python 窗口部件
    • 数据三剑客 Numpy Pandas Matplotlib
    • 数据采集-爬虫技术
    You are visitor 01402520 — GeezerVison does not store the pages you look up.
    Best viewed with Netscape Navigator 4.7 or Internet Explorer 6 at 800×600. No cookies required.