正式的Python專欄第15篇,同學站住,別錯過這個從0開始的文章!
學委之前分享了很多代碼,也發布了幾個庫,
新手可以從兩篇基礎文章入手學習,積累了一些代碼,可以考慮做成一個個模塊,包裝代碼有利呼叫和傳播!
何為模塊
小雷拿了一個短棍,一個鐵方塊,接著把鐵塊跟短棍焊接一起,就是我們看到的雷神之錘了!(如下,一把簡陋的錘子)

為什么說這個錘子?
模塊就是一組python功能集合,比如sys, 或者requests這個就是一個模塊,或者學委開發的pypiseed也是一個模塊,簡單理解就是,把基礎python代碼組合成為一個’錘子‘,被外部使用,
制作模塊的意義是,方便更多的模塊使用者(開發者)就不用太拘泥這個模塊怎么做,簡單就呼叫一個模塊,
下面os.py, python自帶的模塊,這是一個模塊!

下面requests目錄, 是學委自己安裝的, 這也是一個模塊!

下面的pypi-seed, 也是一個模塊,更多介紹在這篇種子專案文章

模塊 vs 庫(包) 區別
模塊可以是一個python檔案, 學委認為也可以是一個庫(多個python檔案的整體),
但是我們說一個庫,通常就是上面提到的pypi_seed 或者requests這些目錄組織的,通常包含多個python代碼檔案,也就是說復雜度更高,可以理解為‘復雜模塊’,
直白來說都是一種“封裝”,包裝,把零散的功能組合起來,就成做出一個個‘錘子’,解決各種開發遇到的問題,
在python里面也使用“package”(包)來概括這種復雜模塊,

如上圖,‘moduledemo’ 就是一個包(package),
所以嚴格來說:包 對等于 庫,包內有多個模塊,使用上包/庫/模塊都是用‘import’來匯入,
制作模塊與使用
開發模塊
保存下面代碼為debug.py
#!/usr/bin/env python
# -*- coding: utf-8 -*-
# @Time : 2021/10/15 11:12 下午
# @Author : LeiXueWei
# @CSDN/Juejin/Wechat: 雷學委
# @XueWeiTag: CodingDemo
# @File : debug.py
# @Project : hello
SHOW_DEBUG = True
def log(log):
if SHOW_DEBUG:
print(str(log))
只需要打開安裝的python路徑里面的lib/python3.8/os.py

把os.py的代碼過一遍,我們可以發現,其實os用了abc/sys/stat這些內置模塊,實作了os模塊自己的函式比如makedirs(創建目錄)或者拓展os.path,
制作一個復雜模塊請參考詳細指導篇,處理明確模塊的功能開發規劃,更重要的就是組織,管理發布模塊了,這涉及很多知識,請看下面的文章:
保姆級教程帶你開發優質的Python庫之上篇【模塊組織】
保姆級教程帶你開發優質的Python庫之中篇【命令列】
保姆級教程帶你開發優質的Python庫之下篇【種子專案】
呼叫模塊 import
#!/usr/bin/env python
# -*- coding: utf-8 -*-
# @Time : 2021/10/15 11:15 下午
# @Author : LeiXueWei
# @CSDN/Juejin/Wechat: 雷學委
# @XueWeiTag: CodingDemo
# @File : test.py
# @Project : hello
#option 1
import debug
debug.log("hello 01")
#option 2
from debug import log
log("hello 01")
#option 3
from debug import log as l
l("hello 01")
這里展示了三種呼叫方式,效果都是一樣的,
也可以像下面一樣:from 模塊名稱 import * (任意函式)
from debug import *
包或者庫的函式呼叫參考下面:
#import 包名.模塊名 imiport * 或者 (import 特定函式)
from pypiseed.main import *
直接運行一個模塊
這個也非常簡單,在開發的debug.py模塊中添加下面的代碼到檔案末:
if __name__ == "__main__":
log("testing")
運行方式:python debug.py
這個就是告訴python程式這里是main入口程式,里面放入呼叫模塊函式的代碼,即可運行,
模塊搜索, 定個位
在python中模塊是這樣被定位/搜索的:
- 最先從當前運行目錄查找模塊
- 如果還沒有找到,python嘗試搜索PYTHONPATH環境變數指定的多個目錄,從前到后一個一個目錄查找目標模塊
- 如果前面兩個步驟仍舊沒有找到,python決議器將會查找默認路徑,比如/usr/local/lib/python3/
這上面其實都是路徑,我們看到python的模塊系統使用了sys.path這個變數來存盤,所以直接簡記為:從sys.path值里面的目錄一個一個查找搜索模塊,
sys.path的只也默認的被設定為當前路徑,PYTHONPATH, 系統默認(跟安裝路徑有關),如下圖:

幾個模塊相關的函式
reload 模塊多載函式
我們剛剛看到os.py 出來def 定義了一些函式,還有一些類似"all" 這樣的代碼,這些代碼只會在import/ from import 陳述句匯入模塊的時候被執行,我們可以使用reload函式重新加載非方法定義的代碼,
使用實體:
#重新加載debug模塊,那些在方法體外直接執行的代碼會再次被運行,
reload(debug)
dir 羅列函式
dir函式也是內置函式之一,它回傳一個排序過的串列,這個串列就是當前程式運行時匯入的所有模塊,
如下圖,分次倒入了不同模塊,dir函式的回傳值不同了,

延伸
Python的模塊加載跟Java的其實還是有點想的,
不過Java的會更加復雜一些,Python還支持運行時動態更改模塊搜索的路徑,這個特性比Java更加靈活,后面會繼續分享文章講解,
對了,喜歡Python的朋友,請關注學委的 Python基礎專欄 or Python入門到精通大專欄
持續學習持續開發,我是雷學委!
編程很有趣,關鍵是把技術搞透徹講明白,
歡迎關注,點贊支持/收藏多看,
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/319743.html
標籤:python
