Python_從零開始學習_(44) 模組 和 包
阿新 • • 發佈:2018-11-02
目錄
1. 模組
1.1 模組的概念
模組是 Python 程式架構的一個核心概念
- 每一個以副檔名 py 結尾的 Python 原始碼檔案都是一個 模組
- 模組名 同樣也是一個 識別符號, 需要符合識別符號的命名規則
- 在模組中定義的 全域性變數, 函式, 類 都是提供給外界直接使用的 工具
- 模組 就好比是 工具包, 想要使用這個工具包中的工具, 就需要先 匯入 這個模組
1.2 模組的兩種匯入方式
1) import 匯入
import 模組名1, 模組名2 # 會報錯, 有波浪線, 不推薦
提示 : 在匯入模組時, 每個匯入應該獨佔一行
import 模組名1
import 模組名2
- 匯入之後
通過 模組名. 使用 模組提供的工具 ---- 全域性變數 , 函式 , 類
使用 as 指定模組的別名
如果模組的名字太長, 可以使用 as 指定模組的名稱, 以方便在程式碼中的使用
import 模組名1 as 模組別名
注意 : 模組別名 應該符合 大駝峰命名法
2) from...import 匯入
- 如果希望 從某一個模組 中, 匯入 部分 工具, 就可以使用 from ... import 的方式
- import 模組名 是 一次性 把模組中 所有工具全部匯入, 並且通過 模組名/別名 訪問
# 從 模組 匯入 某一個工具
from 模組名1 import 工具名
- 匯入之後
不需要 通過 模組名.
可以直接使用 模組提供的工具 ---- 全域性變數 , 函式 , 類 - 注意
如果 兩個模組, 存在 同名的函式, 那麼 後匯入模組的函式, 會 覆蓋掉先匯入的函式
- 開發時 import 程式碼應該統一寫在 程式碼的頂部, 更容易及時發現衝突
- 一旦發現衝突, 可以使用 as 關鍵字 給其中一個工具起一個別名
form ... import * (知道)
# 從 模組 匯入 所有工具
from 模組名1 import *
注意
這種方式不推薦使用, 因為函式重名並沒有任何的提示, 出現問題不好排查
1.3 模組的搜尋順序(擴充套件)
Python 的直譯器在 匯入模組 時, 會 :
- 搜尋 當前目錄 指定模組名的檔案, 如果有就直接匯入
- 如果沒有, 再搜尋 系統目錄
在開發時, 給檔案起名, 不要和 系統的模組檔案 重名
Python 中每一個模組都有一個內建屬性 __file__ 可以 檢視模組 的 完整路徑
示例
import random
rand = random.randint(0, 10)
print(rand)
print(random.__file__)
注意: 如果當前目錄下, 存在一個 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()
或者
# 全域性變數,函式,類,注意: 直接執行的程式碼不是向外界提供的工具!
# 檔案被匯入時, 能夠直接執行的程式碼不需要被執行!
def say_hello():
print("hello world")
if __name__ == "__main__":
print("直接執行!!!")
print(__name__)
say_hello()
if __name__ == "__main__": 意思就是執行當前程式, 下面的程式碼都加了縮排
2. 包 (package)
概念
- 包 是一個 包含多個模組 的 特殊目錄
- 目錄下有一個 特殊的檔案 __init__.py
- 包名的 命名方式 和變數名一致, 小寫字母+ _
好處
- 使用 import 包名 可以一次性匯入 包 中 所有的模組
案例演練
- 新建一個 wk_message 的 包
- 在目錄下, 新建兩個檔案 send_message 和 receive_message
- 在 send_message 檔案中定義一個 send 函式
- 在 receive_message 檔案中定義一個 receive 函式
- 在外部直接匯入 wk_message
__init__.py
- 要在外界使用 包 中的模組, 需要在 __init__.py 中指定 對外界提供的模組列表
# 從 當前目錄 匯入 模組列表
from . import send_message
from . import receive_message
3. 釋出模組 (知道)
- 如果希望自己開發的模組, 分享 給其他人, 可以按以下操作來
3.1 製作釋出壓縮包步驟
1) 建立 setup.py 的檔案
from distutils.core import setup
setup(name="wk_message", # 包名
version="1.0", # 版本
description="傳送資訊和接收資訊模組",
long_description="完整的描述資訊",
author="作者",
author_email="作者郵箱",
url="主頁",
py_modules=["wk_message.send_message",
"wk_message.receive_message"])
2) 構建模組 (控制檯)
$ python3 setup.py build
3) 生成釋出壓縮包 (控制檯)
$ python3 setup.py sdist
注意: 要製作哪個版本的模組, 就使用哪個版本的直譯器
3.2 安裝模組
$ tar -zxvf wk_message-1.0.tar.gz
$ sudo python3 setup.py install
解除安裝模組
直接從安裝目錄下, 把安裝模組的 目錄 刪除就可以
$ sudo rm -r wk_message*
3.3 pip 安裝第三方模組
- 第三方模組 通常是指由 知名的第三方團隊 開發的 並且被 程式設計師廣泛使用 的Python 包 / 模組
pygame 就是一套非常成熟的 遊戲開發模組 - pip 是一個現代的, 通用的 Python 包管理工具
- 提供了對 Python 包的查詢, 下載, 安裝, 解除安裝等功能
安裝和解除安裝命令如下:
# 將模組安裝到 Python 3.x 環境
$ sudo pip3 install pygame
$ sudo pip3 uninstall pygame