一、什么是包
包就是一個包含有__init__.py
文件的文件夾
二、為何要有包
包的本質是模塊的模塊的一種形式,包是用來被當做模塊導入
1、產生一個名稱空間
2、運行包下的__init__.py
文件,將運行過程中產生的名字都丟到1的名稱空間中
3、在當前執行文件的名稱空間中拿到一個名字mmm,mmm指向1的名稱空間
import mmm
from mmm import x
三、python3中與python2中的__init__.py
的不同:
如果下面存放了好多模塊,當然每個模塊都應該有自己自己的名字。我們需要把這些名字拿到__init__.py
里面, 才能使用。python3中即便沒有這個__init__.py
文件也不會報錯,pyhon2二中就會報錯。是因為Python 3具有隱式命名空間包,允許它創建沒有__init__.py
文件的包。但是在python2中必須要有__init__.py
這個文件。
四、包的使用
1、導入包和__init__.py
包屬於模塊的一種,因而包以及包內的模塊均是用來被導入使用的,而絕非被直接執行,首次導入包(如import mmm)同樣會做三件事:
1、產生一個名稱空間
2、運行包下的__init__.py
文件,將運行過程中產生的名字都丟到1的名稱空間中
3、在當前執行文件的名稱空間中拿到一個名字mmm,mmm指向1的名稱空間
import mmm
from mmm import x
強調:
1.關於包相關的導入語句也分為import和from ... import ...兩種,但是無論哪種,無論在什么位置,在導入時都必須遵循一個原則:凡是在導入時帶點的,點的左邊都必須是一個包,否則非法。
可以帶有一連串的點,如import 頂級包.子包.子模塊,但都必須遵循這個原則。但對於導入后,在使用時就沒有這種限制了,點的左邊可以是包,模塊,函數,類(它們都可以用點的方式調用自己的屬性)。
2、包A和包B下有同名模塊也不會沖突,如A.a與B.a來自倆個命名空間
3、import導入文件時,產生名稱空間中的名字來源於文件,import 包,產生的名稱空間的名字同樣來源於文件,即包下的__init__.py
,導入包本質就是在導入該文件
2、絕對導入和相對導入
絕對導入,以包的文件夾作為起始來進行導入
import sys
print('==========>這是在被導入的__init__.py中查看到的sys.path')
print(sys.path)
from foo.m1 import f1
from foo.m2 import f2
from foo.m3 import f3
from foo.bbb.m4 import f4 # foo內有了一個f4
# # import foo.bbb.m4.f4 # 語法錯誤,點的左側必須是一個包
相對導入:僅限於包內使用,不能跨出包(包內模塊之間的導入,推薦使用相對導入)
# .:代表當前文件夾
# ..:代表上一層文件夾
from .m1 import f1
from .m2 import f2
from .m3 import f3
from .bbb.m4 import f4
"""
強調:
1、相對導入只能在包內部使用,用相對導入不同目錄下的模塊是非法的
2、無論是import還是from import,但凡是在導入時帶點的,點的左邊必須是包,否則語法錯誤
3、絕對導入是沒有任何限制的,所以絕對導入是一種通用的導入方式
"""
3、from 包 import *
在使用包時同樣支持from pool.futures import *
* 代表的是futures下__init__.py
中所有的名字,通用是用變量__all__
來控制*代表的意思
需要說明一點,包內部的目錄結構通常是包的開發者為了方便自己管理和維護代碼而創建的
這種目錄結構對包的使用者往往是無用的,此時通過操作__init__.py
可以“隱藏”包內部的目錄結構,降低使用難度,比如想要讓使用者直接使用
import aaa
aaa.get()
需要操作sum下的__init__.py
(提示: get在sum的aaa.py中):
from .aaa import get
五、軟件開發的目錄規范
Foo/
|-- core/ # 存放業務邏輯相關代碼
| |-- core.py
|
|-- api/ # 存放接口文件,接口主要用於為業務邏輯提供數據操作。
| |-- api.py
|
|-- db/ # 存放操作數據庫相關文件,主要用於與數據庫交互
| |-- db_handle.py
|
|-- lib/ # 存放程序中常用的自定義模塊
| |-- common.py
|
|-- conf/ # 存放配置文件
| |-- settings.py
|
|-- run.py # 程序的啟動文件,一般放在項目的根目錄下,因為在運行時會默認將運行文件所在的文件夾作為sys.path的第一個路徑,這樣就省去了處理環境變量的步驟
|-- setup.py #安裝、部署、打包的腳本。
|-- requirements.txt # 存放軟件依賴的外部Python包列表。
|-- README # 項目說明文件
README的內容:
1、軟件定位,軟件的基本功能;
2、運行代碼的方法: 安裝環境、啟動命令等;
3、簡要的使用說明;
4、代碼目錄結構說明,更詳細點可以說明軟件的基本原理;
5、常見問題說明。