Python 核心技术与实战
景霄
Facebook 资深工程师
114324 人已学习
新⼈⾸单¥59
登录后,你可以任选4讲全文学习
课程目录
已完结/共 47 讲
开篇词 (1讲)
Python 核心技术与实战
15
15
1.0x
00:00/00:00
登录|注册

13 | 搭建积木:Python 模块化

import 导入文件时的执行
导入模块的方式
项目结构
代码追溯
版本统一
简化依赖管理
Python 2 和 Python 3 中 __init__.py 的区别
sys.path.append("..") 导入上层目录
使用 . 代替 / 表示子目录
子文件夹的建立
from module_name import *import module_name 的区别
巧用 if __name__ == '__main__' 避免 import 时执行
模块化在大型工程中的重要性
使用绝对路径和相对路径进行模块导入
项目结构示例
if __name__ == '__main__' 的作用
修改 Python 运行环境的路径
Python 解释器的 import 寻找模块的路径
PyCharm 创建项目
代码仓库的优点
相对路径和绝对路径
版本区别
文件结构组织
使用 from 模块名 import 函数名/类名 进行调用
函数、类、常量拆分到不同文件
思考题
总结
神奇的 if __name__ == '__main__'
项目模块化
简单模块化
搭建积木:Python 模块化

该思维导图由 AI 生成,仅供参考

你好,我是景霄。
这是基础版块的最后一节。到目前为止,你已经掌握了 Python 这一门当代武功的基本招式和套路,走出了新手村,看到了更远的世界,有了和这个世界过过招的冲动。
于是,你可能开始尝试写一些不那么简单的系统性工程,或者代码量较大的应用程序。这时候,简单的一个 py 文件已经过于臃肿,无法承担一个重量级软件开发的重任。
今天这节课的主要目的,就是化繁为简,将功能模块化、文件化,从而可以像搭积木一样,将不同的功能,组件在大型工程中搭建起来。

简单模块化

说到最简单的模块化方式,你可以把函数、类、常量拆分到不同的文件,把它们放在同一个文件夹,然后使用 from your_file import function_name, class_name 的方式调用。之后,这些函数和类就可以在文件内直接使用了。
# utils.py
def get_sum(a, b):
return a + b
# class_utils.py
class Encoder(object):
def encode(self, s):
return s[::-1]
class Decoder(object):
def decode(self, s):
return ''.join(reversed(list(s)))
# main.py
from utils import get_sum
from class_utils import *
print(get_sum(1, 2))
encoder = Encoder()
decoder = Decoder()
print(encoder.encode('abcde'))
print(decoder.decode('edcba'))
########## 输出 ##########
3
edcba
abcde
我们来看这种方式的代码:get_sum() 函数定义在 utils.py,Encoder 和 Decoder 类则在 class_utils.py,我们在 main 函数直接调用 from import ,就可以将我们需要的东西 import 过来。
非常简单。
但是这就足够了吗?当然不,慢慢地,你会发现,所有文件都堆在一个文件夹下也并不是办法。
确认放弃笔记?
放弃后所记笔记将不保留。
新功能上线,你的历史笔记已初始化为私密笔记,是否一键批量公开?
批量公开的笔记不会为你同步至部落
公开
同步至部落
取消
完成
0/2000
荧光笔
直线
曲线
笔记
复制
AI
  • 深入了解
  • 翻译
    • 英语
    • 中文简体
    • 中文繁体
    • 法语
    • 德语
    • 日语
    • 韩语
    • 俄语
    • 西班牙语
    • 阿拉伯语
  • 解释
  • 总结

Python模块化开发技术总结 本文深入介绍了Python中的模块化开发技术。首先,作者介绍了简单模块化的方式,包括将函数、类、常量拆分到不同的文件,并通过import语句进行调用。随后,作者讨论了项目模块化的重要性,强调了相对路径和绝对路径的概念,并指出在大型工程中尽可能使用绝对位置是第一要义。此外,作者还分享了在Facebook和Google等公司中的代码仓库独有的优点,包括简化依赖管理、版本统一和代码追溯。最后,通过一个示例展示了如何使用PyCharm创建项目,并演示了如何进行跨模块调用。文章还介绍了Python的Virtual Environment和`if __name__ == '__main__'`的用法。总结来说,本文系统介绍了Python模块化开发的基本概念和实践方法,对于想要系统学习模块化的读者来说,是一篇很有价值的文章。

仅可试看部分内容,如需阅读全部内容,请付费购买文章所属专栏
《Python 核心技术与实战》
新⼈⾸单¥59
立即购买
登录 后留言

全部留言(85)

  • 最新
  • 精选
  • Jingxiao
    置顶
    思考题答案: 很多回复说的很对,from module_name import * 会把 module 中所有的函数和类全拿过来,如果和其他函数名类名有冲突就会出问题;import model_name 也会导入所有函数和类,但是调用的时候必须使用 model_name.func 的方法来调用,等于增加了一层 layer,有效避免冲突。
    2019-06-09
    3
    249
  • 上梁山
    文章中有这么一句话:“import 同一个模块只会被执行一次,这样就可以防止重复导入模块出现问题。” “import 同一个模块只会被执行一次”,这句话让我这个新手有点困惑。 这里的只会被执行一次,指的是导入模块的语句只执行一次,还是指被导入的模块中的语句只执行一次。 我相信很多向我这样的新手,都会认为是前者。 但是,经过代码实验,这里指的是被导入的模块中的语句只执行一次。 假如现在有main.py和foo.py两个文件, foo.py中内容如下: def bar(): print('bar') print('hello') main.py中内容如下: from foo import bar import foo bar() foo.bar() 执行python main.py后的结果是: hello bar bar

    作者回复: 好建议,这里确实没想到读者会有误解。

    2019-12-30
    4
    16
  • 萧潇风
    export PYTHONPATH="/home/ubuntu/workspace/your_projects" 在windows系统 中 亲测无效 T_T

    作者回复: windows 的文件系统和 Linux 不太相同,学计算机科学还是尽早切换到 linux 系统吧

    2019-06-07
    2
    9
  • Paul Shan
    思考题 两者的前缀不同。第一种,把目录下的文件都倒入了,每个文件有各自前缀。第二种,只是倒入了一个前缀,所有文件都通过这个相同前缀。第一种类似于拷贝一个目录下所有文件。第二种类似于拷贝整个目录。

    作者回复: 👍

    2019-11-15
    6
  • enjoylearning
    作者写的都是原来疑惑的地方,如有时候要新建一个模块总是纠结于是添加文件夹还是包,怀疑加文件夹是不是不如加包规范,有时面对每个文件夹一个空的__init__.py,觉得真是不够优雅,现在好了,原来是2和3的区别,以后可以大胆的用文件夹来组织模块了。另外就是觉得python 命名模块名不能像java和.net那样以公司名.application.web.api格式,觉得还是有点别扭。

    作者回复: 哈哈对,除非是老项目维护,新项目最好使用 python 3 来构建,确定好规范后就可以大胆 coding,不用太担心兼容性问题。

    2019-06-08
    6
  • 小侠龙旋风
    在pycharm里,我会使用“Mark Directory as -> Sources Root”来设置当前文件夹为根目录。 思考题: 1.from module_name import * 能够导入模块下所有的类/函数等内容,使用时不需要包含模块名。容易出现重名现象,发生错误; 2.import module_name 只是将模块名导入,调用时必须模块名.xxx。 3.from module_name import class_name 需要用模块中的哪个类就导入哪个类,比较推荐。

    作者回复: 👍

    2019-06-08
    3
  • Kevin
    “import 在导入文件的时候,会自动把所有暴露在外面的代码全都执行一遍。因此,如果你要把一个东西封装成模块,又想让它可以执行的话,你必须将要执行的代码放在 if __name__ == '__main__'下面。” 导入的模块if __name__ == '__main__'下面的语句没有被执行。

    作者回复: 抱歉这里的意思让你造成误解。这里想表达的是: 如果你要把一个东西封装成模块,又想让它`单独`可以被执行的话,你必须将要执行的代码放在 if __name__ == '__main__'下面。

    2020-06-22
    2
  • Paul Shan
    树状结构是大多数项目的组织方式,树状结构本身不复杂,从根节点到每个节点有唯一路径,这条路径可以用一致的方式来引用文件。树状结构可以表达的文件上限是层数的指数,对于大型项目也没问题。如果目录是线性结构,文件一多,查找就费力。文件直接的调用如果用相对路径,这就相当于在树状的结构中引入了中间节点的边,几乎让树成图,复杂度大大增加。

    作者回复: 👍

    2019-11-15
    2
  • 大象
    请教老师一个问题:如果我们所有的项目(项目A,项目B,项目C)都在一个文件夹底下,每个项目都有自己的虚拟运行环境。如果我项目A是公共库,项目B要引用项目A,那么我需要怎么做?谢谢

    作者回复: 正常 import,但是 B 的 requirements.txt 可能要包含 A 正常运行必须的包。另一个建议来自 Google 的开源源代码管理工具 bazel,可以尝试。

    2019-10-25
    2
  • Geek_59f23e
    class_utils.py那儿应该是reversed吧,而不是reverse。

    作者回复: 多谢,是 reversed.

    2019-06-08
    2
收起评论
显示
设置
留言
85
收藏
沉浸
阅读
分享
手机端
快捷键
回顶部