# Python學習筆記(十三): 1. 模塊 2. 包 3. if name == main 4. 軟體目錄結構規範 5. 作業-ATM+購物商城程式 ...
Python學習筆記(十三):
- 模塊
- 包
- if name == main
- 軟體目錄結構規範
- 作業-ATM+購物商城程式
1. 模塊
1. 模塊導入方法
import 語句
import module1[, module2[,... moduleN] # 當我們使用import語句的時候,Python解釋器通過自己的搜索路徑(存在sys.path里)進行搜索
from…import 語句
from modname import name1[, name2[, ... nameN]] # 這個聲明不會把整個modulename模塊導入到當前的命名空間中,只會將它裡面的name1或name2單個引入到執行這個聲明的模塊的全局符號表。
From…import* 語句
from modname import * # 這提供了一個簡單的方法來導入一個模塊中的所有項目。然而這種聲明不該被過多地使用。大多數情況, Python程式員不使用這種方法,因為引入的其它來源的命名,很可能覆蓋了已有的定義。
2. 包
為了避免模塊名衝突,Python又引入了按目錄來組織模塊的方法,稱為包(Package)
舉個例子,一個abc.py的文件就是一個名字叫abc的模塊,一個xyz.py的文件就是一個名字叫xyz的模塊。
現在,假設我們的abc和xyz這兩個模塊名字與其他模塊衝突了,於是我們可以通過包來組織模塊,避免衝突。方法是選擇一個頂層包名:
引入了包以後,只要頂層的包名不與別人衝突,那所有模塊都不會與別人衝突。現在,view.py模塊的名字就變成了hello_django.app01.views,類似的,manage.py的模塊名則是hello_django.manage。
請註意,每一個包目錄下麵都會有一個__init__.py的文件,這個文件是必須存在的,否則,Python就把這個目錄當成普通目錄(文件夾),而不是一個包。init.py可以是空文件,也可以有Python代碼,因為__init__.py本身就是一個模塊,而它的模塊名就是對應包的名字。
**調用包就是執行包下的__init__.py文件
3. if name == main
- 如果我們是直接執行某個.py文件的時候,該文件中那麼”name == 'main'“是True,但是我們如果從另外一個.py文件通過import導入該文件的時候,這時__name__的值就是我們這個py文件的名字而不是__main__。
- 這個功能還有一個用處:調試代碼的時候,在”if name == 'main'“中加入一些我們的調試代碼,我們可以讓外部模塊調用的時候不執行我們的調試代碼,但是如果我們想排查問題的時候,直接執行該模塊文件,調試代碼能夠正常運行!
4. 軟體目錄結構規範
1. 為什麼要設計好目錄結構?
- 可讀性高: 不熟悉這個項目的代碼的人,一眼就能看懂目錄結構,知道程式啟動腳本是哪個,測試目錄在哪兒,配置文件在哪兒等等。從而非常快速的瞭解這個項目。
- 可維護性高: 定義好組織規則後,維護者就能很明確地知道,新增的哪個文件和代碼應該放在什麼目錄之下。這個好處是,隨著時間的推移,代碼/配置的規模增加,項目結構不會混亂,仍然能夠組織良好。
2. 目錄組織方式
- bin/: 存放項目的一些可執行文件,當然你可以起名script/之類的也行。
- foo/: 存放項目的所有源代碼。
- 源代碼中的所有模塊、包都應該放在此目錄。不要置於頂層目錄。
- 其子目錄tests/存放單元測試代碼;
- 程式的入口最好命名為main.py。
- docs/: 存放一些文檔。
- setup.py: 安裝、部署、打包的腳本。
- requirements.txt: 存放軟體依賴的外部Python包列表。
- README: 項目說明文件。
5. 作業-ATM+購物商城程式
- 作業需求:模擬實現一個ATM + 購物商城程式
- 額度 15000或自定義
- 實現購物商城,買東西加入 購物車,調用信用卡介面結賬
- 可以提現,手續費5%
- 每月22號出賬單,每月10號為還款日,過期未還,按欠款總額 萬分之5 每日計息
- 支持多賬戶登錄
- 支持賬戶間轉賬
- 記錄每月日常消費流水
- 提供還款介面
- ATM記錄操作日誌
- 提供管理介面,包括添加賬戶、用戶額度,凍結賬戶等。。。
- 用戶認證用裝飾器