基石爲勤能補拙的迷宮之旅——第十五天(Python模塊)

一、什麼是模塊

模塊就是一系列功能的集合體。在Python中,一個py文件就是一個模塊,比如module.py就是一個模塊,其中模塊名是module。

模塊的四種存在方式(通用類別):

  1. 使用python編寫的.py文件(任何一個py文件都可以作爲模塊)
  2. 把一系列功能屬性相近的模塊組織到一起的文件夾(包)
  3. 使用C編寫並鏈接到python解釋器的內置模塊
  4. 已被編譯爲共享庫或DLL的C或C++擴展

二、爲何使用模塊?

  1. 從文件級別組織代碼,是同特性的功能能統一管理
  2. 可以使用系統或第三方模塊(拿來主義),來提高開發效率

三、使用模塊

(一)import 導入模塊

import 模塊名

1.首次導入模塊發生的三件事

    ①創建一個模塊的名稱空間
    ②執行模塊對應文件,將產生的名字存放於①中的名稱空間。
    ③在當前執行文件中,拿到一個模塊名,該模塊指向①的名稱空間
強調:
    每一個文件都會產生自己的全局名稱空間,且相互不影響,模塊中功能的執行始終以模塊自己的命名空間爲準。
    多次導入,只會編譯執行模塊一次,將其加載到內存,之後的都是直接對名字的引用。
    模塊名.模塊內定義的名字——引用功能

2.起別名

通過as關鍵字可以給模塊起別名: 模塊名一旦起別名,原模塊名就不能再使用

3.優點

1.將複雜冗長的模塊名簡明化

import my_name_is_long as mg
print(mg.num)

2.可以統一功能

engine = input('數據庫選擇 1:mysql  2:oracle:')
if cmd == '1':
    import mysql as db
else:
    import oracle as db
db.功能()  # 不需動這塊

4.一行導入多個模塊(不推薦使用)

import 模塊名1,模塊名2,……,模塊名n

    推薦寫成多行。

(二)from導入模塊

from 模塊名 import 對象

    可以指名道姓導入模板中所有想導入的名字

1.首次導入模塊的三件事

    ①創建一個模塊的名稱空間
    ②執行模塊對應文件,將產生的名字存放於①中的名稱空間。
    ③在①名稱空間中直接拿到模塊中的名字,可以直接使用,不加任何前綴。
強調
    執行模塊中的功能,始終以模塊的名稱空間爲準。
    from……import 名字,拿到的名字可以不加前綴直接使用,使用方便,但問題是容易與當前執行文件相同的名字衝突。

2.起別名

from 模塊名 import 原名 as 新名

3.在一行中導入多個

from 模塊名 import 名,名,……,名

4.from 模塊名 import *

    導入模塊中的所有名字,默認不會導入_開頭的名字
    配合__all__ = ['名字1','名字2',……'名字n'],此時 * 只會導入列表中的名字(包括_開頭的名字)
    不建議直接導入 * ,因爲可讀性差,且極容易出現變量重名

四、區分Python文件的兩種用途

print( __name__)

name__的值
     ①在文件被直接執行的情況下,等於__main

     ②在文件被導入的情況下,等於模塊名。

if __name__ == '__main__'
	測試代碼塊

五、模塊的搜索路徑

    內存中已經加載的模塊—》內置模塊—》sys.path路徑中包含的模塊。    sys.path的第一個值是當前執行文件所在的文件夾。

import sys
sys.path.append(r'路徑')  # 在最後添加
sys.path.insert(index,r'路徑')  # 指定位置插入

六、模塊導入的執行流程

導入模塊的指令:

    1.相對於 函數名() 調用函數體,函數調用會進入函數體,從上至下逐句解釋執行函數體代碼
    2.導入模塊,會進入模塊文件,從上至下逐句解釋執行模塊文件代碼
    3.如果在模塊中又遇到導入其他模塊,會接着進入導入的模塊,從上至下逐句解釋執行文件中代碼,依次類推
    這會導致下面循環導入這個問題

循環導入

    模塊之間出現了環狀導入,如:m1.py 中導入了m2,m2.py 中又導入了m1
    導入模塊是要使用模塊中的變量 ,正常邏輯都是在文件最上方先完成對模塊的導入,再在下方定義自身模塊變量,以及使用導入的模塊中的變量 ,由於導入模塊的特殊機制,第一次導入模塊會編譯執行導入的模塊,也就是會進入模塊逐句執行模塊內容,再次導入只是使用內存中的名字,就會出現下面的情況,m2在使用m1中的變量x,但變量x卻並未產生,這就出現了循環導入問題。

m1.py文件
import m2
x = 10
print(m2.y)

m2.py文件
import m1
y = 10
print(m2.x)

解決方法:延後導入

    1、將循環導入對應包要使用的變量提前定義,再導入響應的包
    2、將導包的路徑放到函數體中,保證存放導包邏輯的函數調用在要使用的變量定義之後
重點:
    問題:from導包極容易出現循環導入問題
    解決:建議from導入方式改用import導入方式

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章