一、Python項目的組織結(jié)構(gòu):包酥宴、模塊啦吧、類(函數(shù)、變量)
包:可以理解為文件夾
模塊:.py文件
類:包含函數(shù)拙寡、變量授滓。函數(shù)和變量算作類里的具體組恒部分,類的特性
二倒庵、包與模塊
1. 命名空間:包名.模塊名 (區(qū)分兩個包下同名的模塊)
2. 包下面還可以有子包褒墨,子包可以與模塊同級
3. 包可以理解為文件夾,但文件夾不一定是包擎宝,若要使文件夾表現(xiàn)為包郁妈,必須在這個文件夾下新建一個名為“__init__.py”的文件。里面內(nèi)容可以為空绍申,不能普通的進(jìn)行命名空間調(diào)用
三噩咪、模塊導(dǎo)入
(一)import?導(dǎo)入模塊語法:
1. import 模塊名
注意:(1)使用模塊前先導(dǎo)入模塊后再使用
????????????(2)使用導(dǎo)入模塊中的變量或函數(shù)的格式:模塊名.變量或函數(shù)
2. 如果結(jié)構(gòu)不同層級顾彰,要用命名空間解決
其中運行后會自動生成一個.pyc文件,為python的自解碼文件
3. import 模塊名 as 名稱
可以解決命名空間過長的問題
eg:import ?t.c7 ?as ?m
print ( m.a)
(二)from 模塊 import a(變量)或 def(函數(shù))
1. 引入
2. 可以用 from ?t.c7 ?import ?* 胃碾,代表引此模塊找那個所有的成員(但是引入不明確)
改進(jìn):在c7模塊中第一行聲明“__all__ = [ a, b ]”涨享,指定引入的變量。
其中“__all__ = [ a, b ]”稱為模塊的內(nèi)置變量或內(nèi)置屬性
附加:
1. 設(shè)置 files.exclude 來隱藏相關(guān)文件和文件夾
2. 代碼換行最好用()厕隧,或者在換行末尾加上反斜杠\ (不推薦)
問題!6碇堋吁讨!
運行程序沒有生成 "__pycache__.py" 文件?峦朗?建丧?
也隱藏不了?波势?翎朱?
四、__init__.py的作用
1. 當(dāng)導(dǎo)入包時尺铣,python會自動執(zhí)行 "__init__.py" 里的代碼拴曲,可作包和模塊的初始化
2. __all__?
3.?可以作批量導(dǎo)入※
五、包與模塊的幾個常見錯誤
?1. 包和模塊不會被重復(fù)導(dǎo)入迄埃。
2. 避免循環(huán)導(dǎo)入
3. 導(dǎo)入模塊時疗韵,python會執(zhí)行模塊里的所有代碼
六、模塊內(nèi)置變量
1. dir()函數(shù):返回模塊的所有變量名稱
2. __****__:表示內(nèi)置變量
eg:__name__ 表示命名空間侄非;__package__ 表示包名稱蕉汪;__doc__ 表示模塊注釋;__file__ ?表示模塊路徑
異常信息
Traceback:錯誤堆棧信息逞怨,表示程序執(zhí)行到錯誤的位置
TypeError:錯誤信息的描述
七者疤、入口文件和普通模塊內(nèi)置變量的區(qū)別
如果一個 .py 文件被當(dāng)做一個應(yīng)用程序的入口:
1. 它的名稱不再是本身模塊的名稱,而是被強制更改為 "__main__"
2. 它不屬于任何包
3. file內(nèi)置變量不會像普通模塊一樣顯示絕對路徑叠赦,它所顯示的值也是不確定值驹马,和執(zhí)行命令所在的目錄有關(guān)(詳情見第二張圖)
※ Python的入口文件和普通導(dǎo)入的模塊文件是有差異的
八、__name__
1. dir() 函數(shù)查看相關(guān)變量
2. 讓python腳本成為一個普通模塊被其他應(yīng)用程序調(diào)用除秀,也可以讓自己成為一個可執(zhí)行文件
3. 有時候一個模塊既想被作為一個可執(zhí)行文件糯累,又想成為一個普通的模塊。
當(dāng)它們處于兩種不同的情形下時册踩,有些邏輯處理時不相同的泳姐,所以如果想知道此時模塊時處于什么情形,可以使用如下代碼
if ?__name__ == '__main__': ? ?pass暂吉,來判斷當(dāng)前模塊是否是一個入口文件
4. python中的普通模塊必須有一個包胖秒,當(dāng)想要把一個可執(zhí)行文件當(dāng)做一個普通模塊運行時缎患,可以使用 -m 參數(shù)
如:python -m 命名空間.模塊名(package_name.module_name) (如下圖)
注:此時若當(dāng)做普通模塊,必須包括 包名/命名空間??? ??
python ?seven\c15.py???
九阎肝、相對導(dǎo)入和絕對導(dǎo)入
頂級包與入口文件 main.py 的位置有關(guān)挤渔,與 main.py 同級的包就是該包下所有模塊的頂級包。而對于入口文件來說不存在包的概念风题。
絕對導(dǎo)入:從頂級包到被導(dǎo)入模塊名稱的完整路徑判导。import 和 from ... import ...
相對導(dǎo)入:“ . ?.. ?... ” 來表示相對路徑。一個點表示當(dāng)前包俯邓,兩個點表示上一級包...骡楼。from ... import ...
注意:
1. import 不支持相對導(dǎo)入,只能使用 from ... import ... 格式實現(xiàn)相對導(dǎo)入
2. 入口文件中不能使用相對導(dǎo)入稽鞭,因為它沒有包的概念
3. 使用相對導(dǎo)入不要超出頂級包,入口文件同級的都不能使用相對導(dǎo)入(圖1)
4. 實在想用相對路徑導(dǎo)入引镊,此時把入口文件當(dāng)做一個模塊來執(zhí)行朦蕴,用 python -m demo.main(圖2)