Python影片教學欄位今天為大家介紹學習Python模組導入機制與大型專案的規格。
前言
在我們平常工程裡使用Python的過程中,常常需要解決各個模組的導入問題,也常常遇到引用路徑查找不到、交叉導入模組等等問題,故寫這篇文章,旨在講述Python的模組導入機制和我們平時大型專案中應該遵循的模組導入規範
Python模組導入
日常程式設計中,為了能夠重複使用寫過的程式碼邏輯,我們都會把這些程式碼封裝成為模組,需要用到的時候可以直接匯入複用,以便提高我們的開發效率。 module能定義函數、類別、變量,也能包含可執行的程式碼。 module來源有3種: ①Python內建的模組(標準庫); ②第三方模組; ③自訂模組;
導入原理
模組的導入一般是在檔案頭使用import關鍵字,import一個模組相當於先執行了一次這個被導入模組,然後在本命名空間建立一個與被導入模組命名空間的聯繫,相當於在本命名空間新建了一個變量,這個變量名稱是被導入模組的名稱,指向被導入模組的命名空間。所以導入的這個模組相當於一個變量,因此多次導入同一個模組只有第一次導入的時候會被執行(後續導入會判斷到這個模組變量已存在所以不執行)
路徑查找機制
每一個導入的模組都會在Python內建字典sys.modules中,Python一啟動,它將被載入在記憶體中,當我們導入新modules,sys.modules將自動記錄下該module。 Python的模組查找路徑的機制是:
- 查找sys.path中的所有路徑下是否有該模組,有則開闢新空間來載入模組;
- 查看sys.modules中是否有內建套件或已安裝的第三方包,有則開闢新空間加載該模組;
所以對於我們自己寫的模組,如果封裝並發布到了PyPi,則可以用pip install直接安裝,並在啟動時載入在記憶體中,透過sys.modules可以查看到 而對於僅需要在本專案中重複使用的模組,我們在複用程式碼中將其路徑加入sys.path中,同樣可以引用到該模組。
絕對路徑導入
所有的模組import都從「根節點」開始。根節點的位置由sys.path中的路徑決定,專案的根目錄一般自動在sys.path。如果希望程式能處處執行,需手動修改sys.path
import sys,os BASE_DIR = os.path.dirname(os.path.abspath(__file__))#项目根目录所在的绝对路径sys.path.append(BASE_DIR)import A, B #导入A、B包复制代码
相對路徑導入
#只關心相對自己目前目錄的模組位置就好。不能在套件(package)的內部直接執行(會報錯)。不管根節點在哪裡,包內的模組相對位置都是正確的。
#from . import b2 #这种导入方式会报错,只有在包内部直接执行的时候才可以这样导入。import b2#正确b2.print_b2()复制代码
Python模組導入常見問題
- 單獨import某個套件名稱時,不會導入該套件中所包含的所有子模組 解決方法:導入的套件中也包含了其他套件的導入,此時需要在每個套件的init.py檔案中導入該套件下的所有模組,最上層才可以直接引用最下層的套件的類別和方法
init檔案
當一個資料夾下有init.py時,意為該文件夾是一個套件(package),其下的多個模組(module)構成一個整體,而這些模組(module)都可透過同一個套件(package)導入其他程式碼中。其中init.py檔案 用於組織套件(package),方便管理各個模組之間的引用、控制著套件的導入行為。
該檔案可以什麼內容都不寫,即為空檔案(為空時,僅用import [該套件]形式 是什麼也做不了的),存在即可,相當於一個標記。
在python3中,即使套件下沒有init.py文件,import 套件仍然不會報錯,而在python2中,套件下一定要有該文件,否則import套件會報錯
all變數
all 是一個重要的變量,用來指定此套件(package)被import *時,哪些模組(module)會被import進【目前作用域】。不在all清單中的模組不會被其他程式引用。可以重寫all,如all= ['目前所屬包模組1名字', '模組1名字'],如果寫了這個,則會按列表中的模組名進行導入
name变量
在包内部直接运行时,包的name == 'main',但是在外部导入包是,可以通过
if __name__ == '__main__':复制代码
来避免实现包内部调试时的逻辑
循环导入
当两个模块A和B之间相互import时,就会出现循环导入的问题,此时程序运行会报错:can not import name xxx,如:
# a.pyprint('from a.py')from b import x y = 'a'复制代码
# b.pyprint('from b.py')from a import y x = 'b'复制代码
我们来分析一下这种错误是怎么出现的:
- 在sys.modules中查找 符号“module b”;
- 如果符号“module b”存在,则获得符号“module b”对应的module对象; 从的dict中获得 符号“x”对应的对象。如果“x”不存在,则抛出异常“ImportError: cannot import name ‘x’”
- 如果符号“module b”不存在,则创建一个新的 module对象。不过此时该新module对象的dict为空。然后执行module b.py文件中的语句,填充的dict。
因此在a.py中执行from b import x的顺序就是1->3,先引入b,b里面from a import y由相当于执行了a.py,顺序是1->2,因为此时b已经引入所以不会执行3,2中无法找到x对象,因为引入b时还没执行到x='b'这一步,所以报错了
解决办法
- 延迟导入,把import语句写在方法/函数里,将它的作用域限制在局部;
- 顶层先引入模块,再把from x import y改成import x.y形式;
- 其实出现循环引用问题的根本原因是程序设计不合理,每个包都应该由上层使用的模块去导入,而不应该在包与包之间各种相互导入,所以应该更改代码布局,可合并或分离竞争资源;
大型项目中Python模块导入规范
分离模块,将同一类别的模块放在同一目录下,形成类别分明的目录架构,如:
- 每一个模块目录都要写init.py文件,可以同时定义all限定可导入的范围;
- 源码根目录可以定义BASE_DIR,限定好根目录路径,启动py文件可以用绝对路径导入各个模块,将必要模块都加入到sys.path中;
- 各个服务之间(例如model需要引入common的模块方法),可以通过相对路径引用模块;
- 程序设计时避免循环导入,可由调用者(服务文件)作为上层第三方引入需要的各个模块,这样就可以减少各个模块的相互导入。
更多相关免费学习推荐:python视频教程
以上是學習Python模組導入機制與大型專案的規範的詳細內容。更多資訊請關注PHP中文網其他相關文章!

每天學習Python兩個小時是否足夠?這取決於你的目標和學習方法。 1)制定清晰的學習計劃,2)選擇合適的學習資源和方法,3)動手實踐和復習鞏固,可以在這段時間內逐步掌握Python的基本知識和高級功能。

Python在Web開發中的關鍵應用包括使用Django和Flask框架、API開發、數據分析與可視化、機器學習與AI、以及性能優化。 1.Django和Flask框架:Django適合快速開發複雜應用,Flask適用於小型或高度自定義項目。 2.API開發:使用Flask或DjangoRESTFramework構建RESTfulAPI。 3.數據分析與可視化:利用Python處理數據並通過Web界面展示。 4.機器學習與AI:Python用於構建智能Web應用。 5.性能優化:通過異步編程、緩存和代碼優

Python在開發效率上優於C ,但C 在執行性能上更高。 1.Python的簡潔語法和豐富庫提高開發效率。 2.C 的編譯型特性和硬件控制提升執行性能。選擇時需根據項目需求權衡開發速度與執行效率。

Python在現實世界中的應用包括數據分析、Web開發、人工智能和自動化。 1)在數據分析中,Python使用Pandas和Matplotlib處理和可視化數據。 2)Web開發中,Django和Flask框架簡化了Web應用的創建。 3)人工智能領域,TensorFlow和PyTorch用於構建和訓練模型。 4)自動化方面,Python腳本可用於復製文件等任務。

Python在數據科學、Web開發和自動化腳本領域廣泛應用。 1)在數據科學中,Python通過NumPy、Pandas等庫簡化數據處理和分析。 2)在Web開發中,Django和Flask框架使開發者能快速構建應用。 3)在自動化腳本中,Python的簡潔性和標準庫使其成為理想選擇。

Python的靈活性體現在多範式支持和動態類型系統,易用性則源於語法簡潔和豐富的標準庫。 1.靈活性:支持面向對象、函數式和過程式編程,動態類型系統提高開發效率。 2.易用性:語法接近自然語言,標準庫涵蓋廣泛功能,簡化開發過程。

Python因其簡潔與強大而備受青睞,適用於從初學者到高級開發者的各種需求。其多功能性體現在:1)易學易用,語法簡單;2)豐富的庫和框架,如NumPy、Pandas等;3)跨平台支持,可在多種操作系統上運行;4)適合腳本和自動化任務,提升工作效率。

可以,在每天花費兩個小時的時間內學會Python。 1.制定合理的學習計劃,2.選擇合適的學習資源,3.通過實踐鞏固所學知識,這些步驟能幫助你在短時間內掌握Python。


熱AI工具

Undresser.AI Undress
人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover
用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool
免費脫衣圖片

Clothoff.io
AI脫衣器

AI Hentai Generator
免費產生 AI 無盡。

熱門文章

熱工具

MinGW - Minimalist GNU for Windows
這個專案正在遷移到osdn.net/projects/mingw的過程中,你可以繼續在那裡關注我們。 MinGW:GNU編譯器集合(GCC)的本機Windows移植版本,可自由分發的導入函式庫和用於建置本機Windows應用程式的頭檔;包括對MSVC執行時間的擴展,以支援C99功能。 MinGW的所有軟體都可以在64位元Windows平台上運作。

Dreamweaver CS6
視覺化網頁開發工具

WebStorm Mac版
好用的JavaScript開發工具

ZendStudio 13.5.1 Mac
強大的PHP整合開發環境

記事本++7.3.1
好用且免費的程式碼編輯器