目錄
- 模塊
- 包
- 發(fā)布模塊
01. 模塊
1.1 模塊的概念
模塊是 Python 程序架構(gòu)的一個核心概念
- 每一個以擴(kuò)展名
py結(jié)尾的Python源代碼文件都是一個 模塊 - 模塊名 同樣也是一個 標(biāo)識符,需要符合標(biāo)識符的命名規(guī)則
- 在模塊中定義的 全局變量 、函數(shù)、類 都是提供給外界直接使用的 工具
- 模塊 就好比是 工具包,要想使用這個工具包中的工具,就需要先 導(dǎo)入 這個模塊
1.2 模塊的兩種導(dǎo)入方式
1)import 導(dǎo)入
import 模塊名1, 模塊名2
提示:在導(dǎo)入模塊時,每個導(dǎo)入應(yīng)該獨占一行
import 模塊名1
import 模塊名2
-
導(dǎo)入之后
- 通過
模塊名.使用 模塊提供的工具 —— 全局變量、函數(shù)、類
- 通過
使用 as 指定模塊的別名
如果模塊的名字太長,可以使用
as指定模塊的名稱,以方便在代碼中的使用
import 模塊名1 as 模塊別名
注意:模塊別名 應(yīng)該符合 大駝峰命名法
2)from...import 導(dǎo)入
- 如果希望 從某一個模塊 中,導(dǎo)入 部分 工具,就可以使用
from ... import的方式 -
import 模塊名是 一次性 把模塊中 所有工具全部導(dǎo)入,并且通過 模塊名/別名 訪問
# 從 模塊 導(dǎo)入 某一個工具
from 模塊名1 import 工具名
- 導(dǎo)入之后
-
不需要 通過
模塊名. - 可以直接使用 模塊提供的工具 —— 全局變量、函數(shù)、類
-
不需要 通過
注意
如果 兩個模塊,存在 同名的函數(shù),那么 后導(dǎo)入模塊的函數(shù),會 覆蓋掉先導(dǎo)入的函數(shù)
- 開發(fā)時
import代碼應(yīng)該統(tǒng)一寫在 代碼的頂部,更容易及時發(fā)現(xiàn)沖突 - 一旦發(fā)現(xiàn)沖突,可以使用
as關(guān)鍵字 給其中一個工具起一個別名
from...import *(知道)
# 從 模塊 導(dǎo)入 所有工具
from 模塊名1 import *
注意
這種方式不推薦使用,因為函數(shù)重名并沒有任何的提示,出現(xiàn)問題不好排查
1.3 模塊的搜索順序[擴(kuò)展]
Python 的解釋器在 導(dǎo)入模塊 時,會:
- 搜索 當(dāng)前目錄 指定模塊名的文件,如果有就直接導(dǎo)入
- 如果沒有,再搜索 系統(tǒng)目錄
在開發(fā)時,給文件起名,不要和 系統(tǒng)的模塊文件 重名
Python 中每一個模塊都有一個內(nèi)置屬性 __file__ 可以 查看模塊 的 完整路徑
示例
import random
# 生成一個 0~10 的數(shù)字
rand = random.randint(0, 10)
print(rand)
注意:如果當(dāng)前目錄下,存在一個
random.py的文件,程序就無法正常執(zhí)行了!
- 這個時候,
Python的解釋器會 加載當(dāng)前目錄 下的random.py而不會加載 系統(tǒng)的random模塊
1.4 原則 —— 每一個文件都應(yīng)該是可以被導(dǎo)入的
- 一個 獨立的
Python文件 就是一個 模塊 - 在導(dǎo)入文件時,文件中 所有沒有任何縮進(jìn)的代碼 都會被執(zhí)行一遍!
實際開發(fā)場景
- 在實際開發(fā)中,每一個模塊都是獨立開發(fā)的,大多都有專人負(fù)責(zé)
-
開發(fā)人員 通常會在 模塊下方 增加一些測試代碼
- 僅在模塊內(nèi)使用,而被導(dǎo)入到其他文件中不需要執(zhí)行
__name__ 屬性
__name__屬性可以做到,測試模塊的代碼 只在測試情況下被運行,而在 被導(dǎo)入時不會被執(zhí)行!
-
__name__是Python的一個內(nèi)置屬性,記錄著一個 字符串 - 如果 是被其他文件導(dǎo)入的,
__name__就是 模塊名 - 如果 是當(dāng)前執(zhí)行的程序
__name__是__main__
在很多 Python 文件中都會看到以下格式的代碼:
# 導(dǎo)入模塊
# 定義全局變量
# 定義類
# 定義函數(shù)
# 在代碼的最下方
def main():
# ...
pass
# 根據(jù) __name__ 判斷是否執(zhí)行下方代碼
if __name__ == "__main__":
main()
02. 包(Package)
概念
- 包 是一個 包含多個模塊 的 特殊目錄
- 目錄下有一個 特殊的文件
__init__.py - 包名的 命名方式 和變量名一致,小寫字母 +
_
好處
- 使用
import 包名可以一次性導(dǎo)入 包 中 所有的模塊
案例演練
- 新建一個
hm_message的 包 - 在目錄下,新建兩個文件
send_message和receive_message - 在
send_message文件中定義一個send函數(shù) - 在
receive_message文件中定義一個receive函數(shù) - 在外部直接導(dǎo)入
hm_message的包
__init__.py
- 要在外界使用 包 中的模塊,需要在
__init__.py中指定 對外界提供的模塊列表
# 從 當(dāng)前目錄 導(dǎo)入 模塊列表
from . import send_message
from . import receive_message
03. 發(fā)布模塊(知道)
- 如果希望自己開發(fā)的模塊,分享 給其他人,可以按照以下步驟操作
3.1 制作發(fā)布壓縮包步驟
1) 創(chuàng)建 setup.py
-
setup.py的文件
from distutils.core import setup
setup(name="hm_message", # 包名
version="1.0", # 版本
description="itheima's 發(fā)送和接收消息模塊", # 描述信息
long_description="完整的發(fā)送和接收消息模塊", # 完整描述信息
author="itheima", # 作者
author_email="itheima@itheima.com", # 作者郵箱
url="www.itheima.com", # 主頁
py_modules=["hm_message.send_message",
"hm_message.receive_message"])
有關(guān)字典參數(shù)的詳細(xì)信息,可以參閱官方網(wǎng)站:
https://docs.python.org/2/distutils/apiref.html
2) 構(gòu)建模塊
$ python3 setup.py build
3) 生成發(fā)布壓縮包
$ python3 setup.py sdist
注意:要制作哪個版本的模塊,就使用哪個版本的解釋器執(zhí)行!
3.2 安裝模塊
$ tar -zxvf hm_message-1.0.tar.gz
$ sudo python3 setup.py install
卸載模塊
直接從安裝目錄下,把安裝模塊的 目錄 刪除就可以
$ cd /usr/local/lib/python3.5/dist-packages/
$ sudo rm -r hm_message*
3.3 pip 安裝第三方模塊
-
第三方模塊 通常是指由 知名的第三方團(tuán)隊 開發(fā)的 并且被 程序員廣泛使用 的
Python包 / 模塊- 例如
pygame就是一套非常成熟的 游戲開發(fā)模塊
- 例如
-
pip是一個現(xiàn)代的,通用的Python包管理工具 - 提供了對
Python包的查找、下載、安裝、卸載等功能
安裝和卸載命令如下:
# 將模塊安裝到 Python 2.x 環(huán)境
$ sudo pip install pygame
$ sudo pip uninstall pygame
# 將模塊安裝到 Python 3.x 環(huán)境
$ sudo pip3 install pygame
$ sudo pip3 uninstall pygame
在 Mac 下安裝 iPython
$ sudo pip install ipython
在 Linux 下安裝 iPython
$ sudo apt install ipython
$ sudo apt install ipython3