模組與包

zenopan發表於2024-04-18
模組定義
  • 一個py 檔案就是一個模組
  • 三層架構: 總(分析功能,分配功能)-->分(給每個檔案分配任務)-->總(將所有功能綜合起來)
  • 可以增加程式的健壯性和可讀性,
  • 增加開發效率
模組的來源
  • python直譯器內建的模組(直接import呼叫)
  • 自己寫的檔案
  • 別人寫好的成熟模組(先用 pip install,再import)
模組的存在形式
  • 單模組
    • 自己定義的功能所在的py檔案
    • 將多個Py檔案放到一個資料夾下
    • 必須有__init__.py檔案
import語句發生的內部原理
  • 前提是有一個py檔案,並且有自己的名稱空間
  • 透過import匯入模組,將所有原始碼執行一變
  • 如果沒有呼叫函式,則不會呼叫,而是檢索到所有函式地址
  • 自動建立一個當前檔案的名稱空間,與自己的名稱空間合併
  • 我們透過模組名.屬性名來呼叫模組中的物件
多模組匯入
  • 單獨匯入
    • import a,b,c,d,...
  • 單獨匯入
    • import a
    • import b
    • import c
詳細匯入語法
  • 只想要具體的指定的引數或者方法
    • from a import b
    • 這樣匯入可以不用模組.b了
    • 直接b領用
  • 匯入模組中的所用方法
    • from a import *
對匯入的模組/模組中的物件重新命名
  • import a as b #把a模組改名為b,呼叫時如下:
  • b.方法
  • 在模組與原檔案物件重複時

迴圈匯入問題

定義:
  • a呼叫b,b呼叫a
解決方法
  • 直接將匯入模組的語法放到最後
    • 會導致沒得用
  • 放到指定的函式內部,只要函式不呼叫就不會觸發匯入語句
搜尋模組的優先順序
  • 查詢模組時的查詢順序

    • 模組分類
      • 純python編寫的模組
      • 內建的一系列模組,包括Python直譯器自帶的和已經用pip install的
      • 使用C語言編寫的底層程式碼
      • C和C++擴充套件的模組
    • 載入從下往上
    • 查詢從上往下
  • 查詢順序

    • 相對路徑

      • 不給路徑就預設在當前目錄
      • ./當前目錄
      • ../上層目錄
    • 絕對路徑

      • sys.path
        

包的定義

  • 模組的集合資料夾,必須包含init方法
包的建立
  • pycharm右鍵python package,會自動生成init檔案
包的使用
  • 直接匯入

    • from 包 import 模組
      使用:
      模組.方法()
      
  • 先在init中註冊:init就相當於包的目錄

  • init註冊:
    from .模組 import 方法
    
    使用:
    from 包 import 方法
    方法()
    
    原因:匯入包時,多了一步操作就是先在init裡匹配方法,找不到然後再挨個模組查詢
    
    
    

json模組

json用途:
  • 序列化
    • 將python中的字典、列表等型別轉換為字串
    • 型別強轉也可以實現,但是不能轉回(不可逆)
  • 反序列化
    • 將python中的字串轉換wield字典、列表等型別
匯入
  • import json:
    with open('file.json','w',encoding='utf8') as p:
    	json.dump(user_dict,fp)
    	
    寫入內容單引號會自動轉換為雙引號,然後儲存。
    可以實現將字典以字串格式寫入檔案,讀取時還是字典
    
json檔案轉為python物件
import json:
with open('file.json','w',encoding='utf8') as p:
	json.load(fp)
	
讀取時還是字典
轉換:反序列化
  • data_json_str =json.dumps(obj) #把字典轉為了字串
  • data_dict = json.loads(obj) #把字串轉為了字典
json儲存資料時的特點
  • 中文內容會自動儲存為二進位制
  • 解決方法:ensure_ascii = False 就可以在寫入時不被寫成asscii碼

相關文章