1.模塊的概述
1.模塊是Python程式架構的一個核心概念,每一個以.py結尾的Python源代碼檔案都是一個模塊
2.模塊名和識別符號的命名規則一樣,由數字字母下劃線組成且不能以數字開頭,也不要和系統的模塊檔案重名
3.在模塊中定義的全域變數,函式,類都是供外界直接使用的工具,模塊是一個包含有一系列變數函式類等組成的程式組
4.模塊就好比工具包,要想使用這個工具包中的工具就需要先匯入模塊,一般模塊名都是以小寫字母開頭
5.Python中每個模塊都有一個內置屬性__file__可以查看模塊的完整路徑
import pygame print(pygame.__file__) # '/usr/local/lib/python3.7/site-packages/pygame/__init__.py'示例:
6.__name__屬性概述:
1.__name__屬性可以做到測驗模塊的代碼只在測驗情況下被運行,而在被匯入時不會被執行
2.__name__是Python的一個內置屬性記錄著一個字串,如果被其他檔案匯入__name__記錄的就是模塊名反之則是__main__
3.用來判斷當前模塊是否為主模塊
1.當此模塊作為主模塊(也就是第一個運行的模塊)運行時,__name__屬性系結'__main__'
2.當此模塊不是主模塊時模塊為檔案名去掉'.py'
# modules_test1.py檔案作為主模塊執行時 import sys # 如果被其他檔案匯入__name__記錄的就是模塊名反之則是__main__ print(__name__) # __main__ # __main__記錄當前執行檔案所在的地址 print(sys.modules['__main__']) # <module '__main__' from '/Users/modules_test1.py'> # sys.modules[__name__]寫在那個檔案里就代表那個檔案的命名空間 print(sys.modules[__name__]) # <module '__main__' from '/Users/modules_test1.py'> # modules_test1.py檔案作為被modules_test2.py檔案匯入模塊執行時 import sys import modules_test1 # 如果被其他檔案匯入__name__記錄的就是模塊名反之則是__main__ print(__name__) # __main__ # __main__記錄當前執行檔案所在的地址 print(sys.modules['__main__']) # <module '__main__' from '/Users/modules_test2.py'> # sys.modules[__name__]寫在那個檔案里就代表那個檔案的命名空間 print(sys.modules[__name__]) # <module '__main__' from '/Users/modules_test2.py'> """模塊加載結果 modules_test1 # 此時__name__屬性記錄著模塊名 <module '__main__' from '/Users/modules_test2.py'> <module 'modules_test1' from '/modules_test1.py'> """示例:
2.模塊的(作用, 分類, 索引順序, 加載程序)
1.模塊的作用:
1.讓一些相關的變數函式類等有邏輯的組織在一起使邏輯結構更加清晰,模塊中的變數函式和類可以供給其他模塊使用
2.模塊化編程有利于多人合作開發和解決函式名和變數名沖突問題,模塊內的變數的作用域為模塊內全域,使代碼更加易于維護提高了代碼的重用率
3.模塊化編程思想: 高內聚,低耦合
高內聚: 使模塊功能單一,不混雜
低耦合: 模塊之間盡量減少相互的關聯和影響
2.模塊的分類:
1.內置模塊: 在解釋器的內部可以直接使用
2.標準庫模塊: 安裝Python時已安裝且可以直接使用
3.第三方模塊: 需要自己安裝才能使用
4.用戶自己撰寫的模塊: 可以作為其他人的第三方模塊
3.匯入模塊時的路徑索引順序: 先索引程式運行時的路徑,找不到時索引 sys.path 里提供的路徑,依然找不到時再次索引內置模塊
4.模塊的加載程序:
1.在模塊匯入時模塊內的所有陳述句都會被執行
1.先索引相關路徑找到模塊的.py檔案,判斷是否有此模塊對應的.pyc檔案,如果沒有此檔案則用.py檔案生成相應的.pyc檔案在進行加載
2.如果.pyc檔案已經存在則判斷.pyc檔案和.py檔案的修改時間再決定是否從新生成.pyc檔案
2.如果一個模塊已經匯入,則再次匯入時不會重新執行模塊內的陳述句
3.模塊的重新加載方法:
import imp
imp.reload(mymod) # 重新加載已經加載過的mymod模塊
5.模塊匯入添加path路徑示例
import sys import os # lst = __file__.split('/') # # base_path = '/'.join(lst[:-2]) base_path = os.path.dirname(os.path.dirname(__file__)) sys.path.append(base_path) from core import main
3.模塊的匯入語法
1.匯入模塊時,每個模塊獨占一行,且匯入模塊應該放到代碼的頂部
2.用as給模塊起別名時應該遵循大駝峰命名法;匯入之后可以通過模塊.使用模塊提供的工具全部變數,函式,類等
3.匯入多個模塊時出現同名的工具,后倒入的模塊會覆寫先匯入的模塊的同名工具,可以通過起別名來解決同名問題
4.匯入模塊順序時應遵循PEP8的代碼規范: 內置模塊 標準庫模塊 第三方模塊 自己寫的模塊
5.關于 'import' 匯入和 'from 模塊名 import 工具名' 匯入的區別
import 匯入實際上是吧模塊中的所有代碼放到當前寫匯入陳述句的位置
from 模塊名 import 工具名 匯入實際上是在當前寫匯入陳述句位置創建一個和工具名同名的變數指向被匯入模塊對應的工具名
import 模塊名
import 模塊名 as 別名
from 模塊名 import * # 從模塊中匯入所用的工具,不推薦使用,工具重名是不會有任何提示
from 模塊名 import 工具名
from 模塊名 import 工具名 as 別名
4.模塊的編譯compile
編譯 解釋執行
mymod.py --->> mymod.pyc ---> python3
5.模塊的檔案字串
模塊內第一行沒有賦值給任何變數的字串為檔案字串
模塊的檔案字串被系結在模塊的 __doc__屬性上,可以用help函式查看
6.模塊的 __all__串列與模塊的影藏屬性
模塊中的__all__串列是一個用來存放可匯入屬性的字串串列;當用from import * 陳述句匯入模塊時,只匯入 __all__ 串列內的屬性
模塊中以_開頭的屬性,在from import * 陳述句匯入時,將不會匯入,通常稱這些屬性為隱藏屬性
# 此py檔案被作為模塊匯入時只能匯入login方法 __all__ = ['login'] name = 'alex' def login(): print('login',name) import sys my_module = sys.modules[__name__] getattr(my_module,'login')()示例:
7.模塊的發布,安裝與洗掉
1.創建setup.py檔案
form distutils.core import setup setup( name="msg", # 包名 version="1.0", # 版本 description="發生和接收訊息模塊", # 描述資訊 long_description="完整的發送和接收訊息模塊", # 完整的描述資訊 author="作者", # 作者 author_email="[email protected]", # 作者郵箱 url="www.xxx.com", # 主頁 py_modules=[ "msg.send_msg", "msg.recv_msg" ] )
2.用終端構建模塊
python3 setup.py build
用終端發布壓縮包
python3 setup.py sdist
3.安裝模塊
tar -zxvf 模塊壓縮包
sudo python setup.py install
4.洗掉模塊: 用import匯入模塊,用模塊.__file__內置函式找到模塊所在路徑,洗掉路徑下的模塊檔案
8.模塊化開發流程和匯入踩坑點
from recv_msg import * from handle_msg import * def main(): # 1. 接收資料 recv_msg() # 2. 測驗是否接收完畢 test_recv_data() # 3. 判斷如果處理完成,則接收其它資料 recv_msg_next() # 4. 處理資料 handle_data() # 5. 測驗是否處理完畢 test_handle_data() # 6. 判斷如果處理完成,則接收其它資料 recv_msg_next() if __name__ == "__main__": main()main.py主模塊
from common import RECV_DATA_LIST # from common import HANDLE_FLAG import common def recv_msg(): """模擬接收到資料,然后添加到common模塊中的串列中""" print("--->recv_msg") for i in range(5): RECV_DATA_LIST.append(i) def test_recv_data(): """測驗接收到的資料""" print("--->test_recv_data") print(RECV_DATA_LIST) def recv_msg_next(): """已經處理完成后,再接收另外的其他資料""" print("--->recv_msg_next") # if HANDLE_FLAG: if common.HANDLE_FLAG: print("------發現之前的資料已經處理完成,這里進行接收其他的資料(模擬程序...)----") else: print("------發現之前的資料未處理完,等待中....------")recv_msg.py接收資料模塊
from common import RECV_DATA_LIST # from common import HANDLE_FLAG import common def handle_data(): """模擬處理recv_msg模塊接收的資料""" print("--->handle_data") for i in RECV_DATA_LIST: print(i) # 既然處理完成了,那么將變數HANDLE_FLAG設定為True,意味著處理完成 # global HANDLE_FLAG # HANDLE_FLAG = True common.HANDLE_FLAG = True def test_handle_data(): """測驗處理是否完成,變數是否設定為True""" print("--->test_handle_data") # if HANDLE_FLAG: if common.HANDLE_FLAG: print("=====已經處理完成====") else: print("=====未處理完成====")handle_msg.py發送資料模塊
RECV_DATA_LIST = list() # 用來存盤資料 HANDLE_FLAG = False # 用來標記是否已經處理完成common.py共享資料模塊
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/53182.html
標籤:Python
下一篇:10.小資料池和深淺拷貝
