模組和包
阿新 • • 發佈:2022-04-06
模組和包
目標
- 模組
- 包
- 釋出模組
01. 模組
1.1 模組的概念
模組是 Python 程式架構的一個核心概念
- 每一個以副檔名
py
結尾的Python
原始碼檔案都是一個 模組 - 模組名 同樣也是一個 識別符號,需要符合識別符號的命名規則
- 在模組中定義的 全域性變數 、函式、類 都是提供給外界直接使用的 工具
- 模組 就好比是 工具包,要想使用這個工具包中的工具,就需要先 匯入 這個模組
1.2 模組的兩種匯入方式
1)import 匯入
import 模組名1, 模組名2 複製請點選Error複製成功
提示:在匯入模組時,每個匯入應該獨佔一行
import 模組名1 import 模組名2 複製請點選Error複製成功
- 匯入之後
- 通過
模組名.
使用 模組提供的工具 —— 全域性變數、函式、類
- 通過
使用 as
指定模組的別名
如果模組的名字太長,可以使用
as
指定模組的名稱,以方便在程式碼中的使用
import 模組名1 as 模組別名複製請點選Error複製成功
注意:模組別名 應該符合 大駝峰命名法
2)from...import 匯入
- 如果希望 從某一個模組 中,匯入 部分 工具,就可以使用
from ... import
的方式 -
import 模組名
是 一次性 把模組中 所有工具全部匯入,並且通過 模組名/別名 訪問
# 從 模組 匯入 某一個工具 from 模組名1 import 工具名複製請點選Error複製成功
- 匯入之後
-
不需要 通過
模組名.
- 可以直接使用 模組提供的工具 —— 全域性變數、函式、類
-
不需要 通過
注意
如果 兩個模組,存在 同名的函式,那麼 後匯入模組的函式,會 覆蓋掉先匯入的函式
- 開發時
import
程式碼應該統一寫在 程式碼的頂部,更容易及時發現衝突 - 一旦發現衝突,可以使用
as
關鍵字 給其中一個工具起一個別名
from...import *(知道)
# 從 模組 匯入 所有工具
from 模組名1 import *複製請點選Error複製成功
注意
這種方式不推薦使用,因為函式重名並沒有任何的提示,出現問題不好排查
[1.3 模組的搜尋順序擴充套件]
Python
的直譯器在 匯入模組 時,會:
- 搜尋 當前目錄 指定模組名的檔案,如果有就直接匯入
- 如果沒有,再搜尋 系統目錄
在開發時,給檔案起名,不要和 系統的模組檔案 重名
Python
中每一個模組都有一個內建屬性 __file__
可以 檢視模組 的 完整路徑
示例
import random
# 生成一個 0~10 的數字
rand = random.randint(0, 10)
print(rand)
複製請點選Error複製成功
注意:如果當前目錄下,存在一個
random.py
的檔案,程式就無法正常執行了!
- 這個時候,
Python
的直譯器會 載入當前目錄 下的random.py
而不會載入 系統的random
模組
1.4 原則 —— 每一個檔案都應該是可以被匯入的
- 一個 獨立的
Python
檔案 就是一個 模組 - 在匯入檔案時,檔案中 所有沒有任何縮排的程式碼 都會被執行一遍!
實際開發場景
-
在實際開發中,每一個模組都是獨立開發的,大多都有專人負責
-
開發人員
通常會在
模組下方
增加一些測試程式碼
- 僅在模組內使用,而被匯入到其他檔案中不需要執行
__name__
屬性
__name__
屬性可以做到,測試模組的程式碼 只在測試情況下被執行,而在 被匯入時不會被執行!
-
__name__
是Python
的一個內建屬性,記錄著一個 字串 - 如果 是被其他檔案匯入的,
__name__
就是 模組名 - 如果 是當前執行的程式
__name__
是__main__
在很多 Python
檔案中都會看到以下格式的程式碼:
# 匯入模組
# 定義全域性變數
# 定義類
# 定義函式
# 在程式碼的最下方
def main():
# ...
pass
# 根據 __name__ 判斷是否執行下方程式碼
if __name__ == "__main__":
main()
複製請點選Error複製成功
02. 包(Package)
概念
- 包 是一個 包含多個模組 的 特殊目錄
- 目錄下有一個 特殊的檔案
__init__.py
- 包名的 命名方式 和變數名一致,小寫字母 +
_
好處
- 使用
import 包名
可以一次性匯入 包 中 所有的模組
案例演練
- 新建一個
laowang_message
的 包 - 在目錄下,新建兩個檔案
send_message
和receive_message
- 在
send_message
檔案中定義一個send
函式 - 在
receive_message
檔案中定義一個receive
函式 - 在外部直接匯入
laowang_message
的包
__init__.py
- 要在外界使用 包 中的模組,需要在
__init__.py
中指定 對外界提供的模組列表
# 從 當前目錄 匯入 模組列表
from . import send_message
from . import receive_message複製請點選Error複製成功
03. 釋出模組(知道)
- 如果希望自己開發的模組,分享 給其他人,可以按照以下步驟操作
3.1 製作釋出壓縮包步驟
1) 建立 setup.py
-
setup.py
的檔案
from distutils.core import setup
setup(name="laowang_message", # 包名
version="1.0", # 版本
description="laowang's 傳送和接收訊息模組", # 描述資訊
long_description="完整的傳送和接收訊息模組", # 完整描述資訊
author="laowang", # 作者
author_email="[email protected]", # 作者郵箱
url="www.laowang.com", # 主頁
py_modules=["laowang_message.send_message",
"laowang_message.receive_message"])
複製請點選Error複製成功
有關字典引數的詳細資訊,可以參閱官方網站:
https://docs.python.org/3.8/distutils/apiref.html
2) 構建模組
$ python3 setup.py build複製請點選Error複製成功
3) 生成釋出壓縮包
$ python3 setup.py sdist複製請點選Error複製成功
注意:要製作哪個版本的模組,就使用哪個版本的直譯器執行!
3.2 安裝模組
$ tar -zxvf laowang_message-1.0.tar.gz
$ sudo python3 setup.py install複製請點選Error複製成功
解除安裝模組
直接從安裝目錄下,把安裝模組的 目錄 刪除就可以
$ cd /usr/local/lib/python3.5/dist-packages/
$ sudo rm -r laowang_message*複製請點選Error複製成功
3.3 pip
安裝第三方模組
-
第三方模組
通常是指由
知名的第三方團隊
開發的
並且被
程式設計師廣泛使用
的
Python
包 / 模組
- 例如
pygame
就是一套非常成熟的 遊戲開發模組
- 例如
-
pip
是一個現代的,通用的Python
包管理工具 -
提供了對
Python
包的查詢、下載、安裝、解除安裝等功能
安裝和解除安裝命令如下:
# 將模組安裝到 Python 2.x 環境
$ sudo pip install pygame
$ sudo pip uninstall pygame
# 將模組安裝到 Python 3.x 環境
$ sudo pip3 install pygame
$ sudo pip3 uninstall pygame複製請點選Error複製成功
在 Mac
下安裝 iPython
$ sudo pip install ipython複製請點選Error複製成功
在 Linux
下安裝 iPython
$ sudo apt install ipython
$ sudo apt install ipython3