1. 程式人生 > 實用技巧 >python模組與包

python模組與包

一、什麼是包?

包是一個內部帶有__init__.py的資料夾,包也可以被匯入,並且可以一併匯入包下的所有模組。

二、為什麼要使用包?

包的本質就是一個資料夾,那麼資料夾唯一的功能就是將檔案組織起來。
隨著功能越寫越多,我們無法將所有功能都放到一個檔案中,於是我們使用模組去組織功能,而隨著模組越來越多,我們就需要用資料夾將模組檔案組織起來,以此來提高程式的結構性和可維護性。
在包中有一個__init__.py, 由它來幫我們管理模組。

三、怎麼使用包?

  1. import 包.模組名
  2. from 包 import 模組名
  3. from 包.模組名 import 模組中的名字

匯入包時發生的事情:

  1. 當包被匯入時,會執行包中的__init__.py,產生一個名稱空間。
  2. ,會將__init__.py中的所有名字新增到名稱空間中。
  3. 接著會將包下所有的模組的名字載入到__init__.py產生的名稱空間中。
  4. 匯入的模組指向的名稱空間其實就是__init__.py產生的名稱空間。

強調
  在python3中,即使包裡面沒有__init__.py檔案,import 包仍然不會報錯,而在python2中,包裡面一定要有該檔案,否則import 包報錯

模組

一、 什麼是模組?

模組是一系列功能程式碼的集合體。
在Python中,一個.py檔案就是一個模組,檔名為xxx.py模組名則是xxx,匯入模組可以引用模組中已經寫好的功能

- 模組的三種來源:
    1.python內建的模組: (python直譯器的)
        比如: sys\time\os\turtle

    2.第三方的模組: (別人寫的)
        比如: requests

    3.程式設計師自定義的模組: (自己寫的)
        比如: 自己定義的demo.py檔案
- 模組的四種表現形式:
    1.使用python編寫的py檔案。(瞭解)
    2.編譯後的共享庫DLL或者是C或者C++庫。(瞭解)
    3.包下面帶有__init__.py的一組py檔案。
        -
- __init__.py - demo.py - demo2.py 4.python直譯器下的py檔案。 - python直譯器下的資料夾 - 一個個的py檔案

二、 為什麼要使用模組?

  • 模組可以幫我們更好地管理功能程式碼,比如: 函式...
  • 可以將專案拆分成一個個的功能,分別存放在不同的py檔案(模組)中。

三、 如何建立,編寫模組,並使用模組

    • 滑鼠右鍵建立py檔案
      在py檔案編寫python程式碼

    • 在一個檔案中,通過import關鍵字匯入模組
      import 模組名
      注意: import 模組時,模組不能加.py字尾

    • 在使用模組階段,必須要注意,誰是執行檔案,誰是被匯入檔案(被匯入的模組)

    • 模組在首次匯入時,匯入的模組已經將其載入到記憶體空間了,之後的重複匯入會直接引用記憶體中已存在的模組,不會重複執行檔案,通過import sys,列印sys.modules的值可以看到記憶體中已經載入的模組名。

    • 在檔案開頭匯入模組屬於全域性作用域,在函式內匯入的模組則屬於區域性的作用域。

模組在匯入時發生的事情:

  1. 會先執行當前執行檔案,並生成當前執行檔案的的名稱空間。
  2. 當執行到被匯入模組的程式碼時,被匯入的模組會產生一個模組的名稱空間。
  3. 將被匯入模組的名稱空間載入到記憶體中。
import foo      #匯入模組foo
a=foo.x         #引用模組foo中變數x的值賦值給當前名稱空間中的名字a
foo.get()         #呼叫模組foo的get函式
foo.change()     #呼叫模組foo中的change函式
給模組起別名 as
import 模組 as 模組的別名

四、 迴圈匯入問題

- m1.py
        print('正在匯入m1')
        from m2 import y
        x='m1'

    - m2.py
        print('正在匯入m2')
        from m1 import x
    - run.py
        import m1                #執行run.py會報錯


    - 解決迴圈匯入問題:
        1.需要查詢的名字放在匯入模組的上方
        2.在函式內部匯入,將模組載入到區域性名稱空間中

五、py檔案區分兩種用途:模組與指令碼

編寫好的一個python檔案可以有兩種用途:
    一:指令碼,一個檔案就是整個程式,用來被執行
    二:模組,檔案中存放著一堆功能,用來被匯入使用
    
print(__name__)

__name__的值1、在檔案被直接執行的情況下,等於'__main__'
2、在檔案被匯入的情況下,等於模組名

作用:用來控制.py檔案在不同的應用場景下執行不同的邏輯

if __name__ =='__main__'
    func()

七、模組的搜尋路徑

模組的查詢順序

  1. 記憶體中已經載入的模組
  2. 內建模組
  3. sys.path路徑中包含的模組

強調:sys.path的第一個路徑是當前執行檔案所在的資料夾

import sys
print(sys.path)   

import sys
print(sys.modules)  #查詢記憶體中存在的模組