python 的類 模組 包的區別
類
類的概念在許多語言中出現,很容易理解。它將資料和操作進行封裝,以便將來的複用。
模組
模組,在Python可理解為對應於一個檔案。在建立了一個指令碼檔案後,定義了某些函式和變數。你在其他需要這些功能的檔案中,匯入這模組,就可重用這些函式和變數。一般用module_name.fun_name,和module_name.var_name進行使用。這樣的語義用法使模組看起來很像類或者名字空間,可將module_name 理解為名字限定符。模組名就是檔名去掉.py字尾。
client.py
def func():
print "hello world!"
main.py
import client
if __name__ == '__main__':
print __name__
client.func()
print client.__name__
>>python main.py ---> result:
__main__
hello world!
client
模組屬性__name__,它的值由Python直譯器設定。如果指令碼檔案是作為主程式呼叫,其值就設為__main__,如果是作為模組被其他檔案匯入,它的值就是其檔名。
每個模組都有自己的私有符號表,所有定義在模組裡面的函式把它當做全域性符號表使用。
模組可以匯入其他的模組。通常將import語句放在模組的開頭,被匯入的模組名字放在匯入它的模組的符號表中。
模組搜尋路徑
上面的例子中,當client被匯入後,python直譯器就在當前目錄下尋找client.py的檔案,然後再從環境變數PYTHONPATH尋找,如果這環境變數沒有設定,也不要緊,直譯器還會在安裝預先設定的的一些目錄尋找。這就是在匯入下面這些標準模組,一切美好事情能發生的原因。
這些搜尋目錄可在執行時動態改變,比如將module1.py不放在當前目錄,而放在一個冷僻的角落裡。這裡你就需要通過某種途徑,如sys.path,來告知Python了。sys.path返回的是模組搜尋列表,通過前後的輸出對比和程式碼,應能理悟到如何增加新路徑的方法了吧。非常簡單,就是使用list的append()或insert()增加新的目錄。
#module2.py import sys import os print sys.path workpath = os.path.dirname(os.path.abspath(sys.argv[0])) sys.path.insert(0, os.path.join(workpath, 'modules')) print sys.path
其他的要點
模組能像包含函式定義一樣,可包含一些可執行語句。這些可執行語句通常用來進行模組的初始化工作。這些語句只在模組第一次被匯入時被執行。這非常重要,有些人以為這些語句會多次匯入多次執行,其實不然。
模組在被匯入執行時,python直譯器為加快程式的啟動速度,會在與模組檔案同一目錄下生成.pyc檔案。我們知道python是解釋性的指令碼語言,而.pyc是經過編譯後的位元組碼,這一工作會自動完成,而無需程式設計師手動執行。
包
通常包總是一個目錄,可以使用import匯入包,或者from + import來匯入包中的部分模組。包目錄下為首的一個檔案便是 __init__.py。然後是一些模組檔案和子目錄,假如子目錄中也有 __init__.py 那麼它就是這個包的子包了。
在建立許許多多模組後,我們可能希望將某些功能相近的檔案組織在同一資料夾下,這裡就需要運用包的概念了。包對應於資料夾,使用包的方式跟模組也類似,唯一需要注意的是,當資料夾當作包使用時,資料夾需要包含__init__.py檔案,主要是為了避免將資料夾名當作普通的字串。__init__.py的內容可以為空,一般用來進行包的某些初始化工作或者設定__all__值,__all__是在from package-name import *這語句使用的,全部匯出定義過的模組。
包是一個有層次的檔案目錄結構,它定義了由n個模組或n個子包組成的python應用程式執行環境。
通俗一點:包是一個包含__init__.py 檔案的目錄,該目錄下一定得有這個__init__.py檔案和其它模組或子包。
常見問題:
-
引入某一特定路徑下的模組
- 使用
sys.path.append(yourmodulepath)
- 使用
-
將一個路徑加入到python系統路徑下,避免每次通過程式碼指定路徑
- 利用系統環境變數
export PYTHONPATH=$PYTHONPATH:yourmodulepath
, - 直接將這個路徑連結到類似
/Library/Python/2.7/site-packages
目錄下
- 利用系統環境變數
-
好的建議
- 經常使用
if __name__ == '__main__'
,保證你寫包既可以import又可以獨立執行,用於test。 - 多次import不會多次執行模組,只會執行一次。可以使用
reload
來強制執行模組,但不提倡。
- 經常使用
包(package)
為了組織好模組,將多個模組分為一個包。包是python模組檔案所在的目錄,且該目錄下必須存在__init__.py
檔案。常見的包結構如下:
package_a
├── __init__.py
├── module_a1.py
└── module_a2.py
package_b
├── __init__.py
├── module_b1.py
└── module_b2.py
main.py
- 如果
main.py
想要引用packagea
中的模組module
a1
,可以使用:
from package_a import module_a1
import package_a.module_a1
- 如果
packagea
中的module
a1
需要引用packageb
,那麼預設情況下,python是找不到package
b
。我們可以使用sys.path.append('../')
,可以在packagea
中的__init__.py
新增這句話,然後該包下得所有module都新增*import __init
_
即可。
相關文章
- Python類、模組、包的概念及區別Python
- python的模組和類有什麼區別Python
- Python語言中的模組、包、庫之間有什麼區別?Python
- Python中爬蟲框架或模組的區別Python爬蟲框架
- Python中爬蟲框架或模組的區別!Python爬蟲框架
- Python中的類、模組和包究竟是什麼?Python
- Python - 模組包Python
- python模組與包Python
- Python - 模組與包Python
- Python包與模組Python
- python:windows和linux下multiprocessing模組建立程序的區別PythonWindowsLinux
- python包和模組的內容整理Python
- Python中的包模組引用成員的方法Python
- Python包和模組管理Python
- Python的包(package)和模組(module)介紹PythonPackage
- Nginx的HTTP模組與Stream模組:區別與應用場景NginxHTTP
- 不同規模伺服器種類的區別伺服器
- Python學習之模組與包Python
- python 基礎之模組與包Python
- python中類方法的區別是什麼Python
- 什麼是模組?Python模組分為哪幾類?Python
- BOSHIDA DC電源模組與其他電源模組的區別與優勢
- USB 包的分類(令牌包這些)與USB 域的區別及關係
- ES6 模組化與 CommonJS 模組化區別JS
- 前端模組化,AMD和CMD的區別總結前端
- python的logging模組Python
- python的os模組Python
- Python的shutil模組Python
- Python基礎入門(8)- Python模組和包Python
- python-包及日誌模組使用Python
- Python之列表與元組的區別詳解Python
- npm模組管理-區分測試包和穩定包NPM
- Python案例學習——模組和包、爬蟲的基礎概念Python爬蟲
- 關於Python包和模組的10個知識清單Python
- 原始碼包和rpm包的區別原始碼
- UML-類圖-Composition(組合)和Aggregation(聚合)的區別
- Python logging模組的使用Python
- Python中的abc模組Python
- python中的chardet模組Python