1. 程式人生 > >Python_從零開始學習_(44) 模組 和 包

Python_從零開始學習_(44) 模組 和 包

目錄

 

1.  模組

1.1  模組的概念

1.2  模組的兩種匯入方式

1.3  模組的搜尋順序(擴充套件)

1.4  原則 ---- 每一個檔案都應該是可以被匯入的

2.  包 (package)

3.  釋出模組  (知道)

3.1  製作釋出壓縮包步驟

3.2  安裝模組

3.3  pip 安裝第三方模組


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 的直譯器在 匯入模組 時, 會 : 

  1. 搜尋 當前目錄 指定模組名的檔案,  如果有就直接匯入
  2. 如果沒有,  再搜尋 系統目錄

在開發時,  給檔案起名,  不要和  系統的模組檔案 重名

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 包名 可以一次性匯入 包 中 所有的模組

案例演練

  1. 新建一個 wk_message 的 
  2. 在目錄下,  新建兩個檔案 send_message 和 receive_message
  3. 在 send_message 檔案中定義一個 send 函式
  4. 在 receive_message 檔案中定義一個 receive 函式
  5. 在外部直接匯入 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