Python通過(guò)模塊化開(kāi)發(fā)優(yōu)化代碼的技巧分享
寫個(gè)項(xiàng)目,文件夾里 .py
文件堆成山,變量名取到懷疑人生,函數(shù)到處復(fù)制粘貼,代碼改一次崩三回……每次打開(kāi)項(xiàng)目,內(nèi)心就一個(gè)感受——“這都啥玩意兒?”
放心,咱今天就來(lái)聊聊如何用模塊化開(kāi)發(fā),拯救你的代碼,讓它井井有條、優(yōu)雅可讀,從此告別“屎山”!
什么是模塊化開(kāi)發(fā)
簡(jiǎn)單來(lái)說(shuō),模塊化開(kāi)發(fā)就是把代碼拆成一個(gè)個(gè)“零件”,該封裝封裝,該拆分拆分。就像搭樂(lè)高一樣,把不同的功能拆成一個(gè)個(gè)小塊,隨用隨取,既不浪費(fèi)時(shí)間,也不讓代碼亂成一鍋粥。
Python 里,模塊(module) 就是一個(gè) .py
文件,里面可以定義函數(shù)、類、變量,還可以包含可執(zhí)行代碼。多個(gè)模塊可以組成包(package),多個(gè)包再組成一個(gè)完整的項(xiàng)目。
比喻一下:
- 模塊(module)= 樂(lè)高積木
- 包(package)= 一套樂(lè)高玩具
- 項(xiàng)目 = 拼好的樂(lè)高城堡
說(shuō)了這么多,咱直接上代碼,看看到底怎么玩!
如何拆分代碼
假設(shè)我們要寫一個(gè)簡(jiǎn)單的計(jì)算器,支持加減乘除。一般人可能會(huì)直接在 calculator.py
里寫一堆函數(shù):
# calculator.py def add(a, b): return a + b def subtract(a, b): return a - b def multiply(a, b): return a * b def divide(a, b): if b == 0: raise ValueError("除數(shù)不能為0!") return a / b
這么寫倒也行,但問(wèn)題來(lái)了:
- 如果以后還要加新功能,比如平方、開(kāi)根號(hào),這個(gè)文件會(huì)越來(lái)越長(zhǎng)。
- 代碼全堆在一個(gè)
.py
里,復(fù)用性差,邏輯混亂。 - 別人(包括未來(lái)的自己)接手這段代碼時(shí),容易迷失在一堆函數(shù)里。
改進(jìn)版:拆分成模塊
我們可以把不同功能拆分到不同的文件里,比如這樣:
calculator/
│── operations/
│ │── __init__.py
│ │── add.py
│ │── subtract.py
│ │── multiply.py
│ │── divide.py
│── main.py
然后,每個(gè)文件只處理自己的功能:
# operations/add.py def add(a, b): return a + b
# operations/divide.py def divide(a, b): if b == 0: raise ValueError("除數(shù)不能為0!") return a / b
最后,在 main.py
里這樣用:
from operations.add import add from operations.divide import divide print(add(10, 5)) # 15 print(divide(10, 2)) # 5.0
優(yōu)點(diǎn):
? 結(jié)構(gòu)清晰:每個(gè)功能各司其職,文件夾一目了然。
? 易維護(hù):以后加新功能,直接加新模塊,互不影響。
? 可復(fù)用:不同項(xiàng)目里可以直接復(fù)用這些模塊。
細(xì)節(jié)提示:
__init__.py
的作用是把operations/
變成一個(gè) Python 包,這樣我們才能用from operations.add import add
這樣的方式導(dǎo)入。- 模塊的命名盡量簡(jiǎn)潔有意義,比如
add.py
而不是this_is_add_function.py
,文件名太長(zhǎng)會(huì)讓導(dǎo)入變得痛苦
讓模塊更強(qiáng)大:使用 __init__.py
有時(shí)候,我們不想每次都 from operations.add import add
,希望直接 from operations import add
,那就要利用 __init__.py
:
# operations/__init__.py from .add import add from .subtract import subtract from .multiply import multiply from .divide import divide
這樣,我們就可以一次性導(dǎo)入所有操作:
from operations import add, divide print(add(10, 5)) # 15 print(divide(10, 2)) # 5.0
很多 Python 開(kāi)發(fā)者容易忽視的一點(diǎn):
如果 __init__.py
里不寫任何內(nèi)容,那 from operations import add
是會(huì)報(bào)錯(cuò)的,因?yàn)?Python 不知道 operations
這個(gè)包里有哪些東西能被導(dǎo)入。
你一定會(huì)遇到的問(wèn)題
模塊導(dǎo)入失?。縈oduleNotFoundError
ModuleNotFoundError: No module named 'operations'
解決方案:
確保你在正確的目錄下運(yùn)行 main.py
,不能在 operations/
里運(yùn)行。
在 main.py
開(kāi)頭加上:
import sys sys.path.append(".") # 確保 Python 知道當(dāng)前目錄
import * 為什么不推薦
有人喜歡這樣寫:
from operations import *
看似很方便,但這其實(shí)是個(gè)坑,因?yàn)椋?/p>
- 你不知道具體導(dǎo)入了哪些東西,可能會(huì)覆蓋已有的變量。
- 代碼可讀性變差,別人(包括未來(lái)的你)會(huì)一臉懵逼。
__init__.py
里沒(méi)__all__
的話,這種方式甚至?xí)?bào)錯(cuò)。
所以,建議明確導(dǎo)入所需模塊,比如:
from operations import add, divide # 一目了然
總結(jié)
- 模塊化開(kāi)發(fā)能讓代碼更清晰、可復(fù)用、易維護(hù),是寫好 Python 代碼的必備技能!
- 一個(gè) .py 文件就是一個(gè)模塊,多個(gè)模塊組成包(package)。
- __init__.py 可以幫助管理包的導(dǎo)入,但用法要注意。
- 避免 import *,盡量使用顯式導(dǎo)入,代碼更可讀。
到此這篇關(guān)于Python通過(guò)模塊化開(kāi)發(fā)優(yōu)化代碼的技巧分享的文章就介紹到這了,更多相關(guān)Python模塊化開(kāi)發(fā)內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Django實(shí)現(xiàn)WebSocket在線聊天室功能(channels庫(kù))
本文基于channels庫(kù)Django實(shí)現(xiàn)WebSocket在線聊天室功能,包括安裝及創(chuàng)建django項(xiàng)目的全過(guò)程,通過(guò)實(shí)例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2021-09-09python matplotlib庫(kù)繪制條形圖練習(xí)題
這篇文章主要介紹了python matplotlib庫(kù)繪制條形圖練習(xí)題,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2019-08-08導(dǎo)致python中import錯(cuò)誤的原因是什么
在本篇文章里小編給大家整理了關(guān)于python的import錯(cuò)誤原因以及相關(guān)內(nèi)容,需要的朋友們可以學(xué)習(xí)下。2020-07-07淺談pandas用groupby后對(duì)層級(jí)索引levels的處理方法
今天小編就為大家分享一篇淺談pandas用groupby后對(duì)層級(jí)索引levels的處理方法,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2018-11-11Python標(biāo)準(zhǔn)庫(kù)學(xué)習(xí)之psutil內(nèi)存詳解
本篇文章給大家介紹一個(gè)Python標(biāo)準(zhǔn)庫(kù)中的psutil模塊,它是一個(gè)跨平臺(tái)庫(kù),下面來(lái)學(xué)習(xí)一下器常用的功能及使用方法吧,有需要的同學(xué)可以借鑒參考下2021-09-09Python使用騰訊云API實(shí)現(xiàn)短信驗(yàn)證碼功能
使用Python與騰訊云接口對(duì)接,實(shí)現(xiàn)短信驗(yàn)證碼功能變得非常簡(jiǎn)單,只需要幾行代碼就能夠輕松實(shí)現(xiàn)短信的發(fā)送,無(wú)須關(guān)心復(fù)雜的短信協(xié)議和底層實(shí)現(xiàn),讀者可以根據(jù)自己的實(shí)際需求,靈活使用騰訊云短信SDK提供的API來(lái)實(shí)現(xiàn)更豐富的短信功能2024-01-01python讀取dicom圖像示例(SimpleITK和dicom包實(shí)現(xiàn))
今天小編就為大家分享一篇python讀取dicom圖像示例(SimpleITK和dicom包實(shí)現(xiàn)),具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2020-01-01Python Unittest ddt數(shù)據(jù)驅(qū)動(dòng)的實(shí)現(xiàn)
本文主要介紹了Python Unittest ddt數(shù)據(jù)驅(qū)動(dòng)的實(shí)現(xiàn),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2023-02-02