Python 模組和包的概念

2022-04-04 13:46:23 字數 4208 閱讀 6493

模組(modue)的概念:

在計算機程式的開發過程中,隨著程式**越寫越多,在一個檔案裡**就會越來越長,越來越不容易維護。

為了編寫可維護的**,我們把很多函式分組,分別放到不同的檔案裡,這樣,每個檔案包含的**就相對較少,很多程式語言都採用這種組織**的方式。在python中,一個.py檔案就稱之為一個模組(module)。

使用模組有什麼好處?

最大的好處是大大提高了**的可維護性。

其次,編寫**不必從零開始。當一個模組編寫完畢,就可以被其他地方引用。我們在編寫程式的時候,也經常引用其他模組,包括python內建的模組和來自第三方的模組。

所以,模組一共三種:

另外,使用模組還可以避免函式名和變數名衝突。相同名字的函式和變數完全可以分別存在不同的模組中,因此,我們自己在編寫模組時,不必考慮名字會與其他模組衝突。但是也要注意,儘量不要與內建函式名字衝突。

模組匯入方法

1 import 語句

1importmodule1[, module2[,... modulen]

當我們使用import語句的時候,python直譯器是怎樣找到對應的檔案的呢?答案就是直譯器有自己的搜尋路徑,存在sys.path裡。  12

['', '/usr/lib/python3.4', '/usr/lib/python3.4/plat-x86_64-linux-gnu',

'/usr/lib/python3.4/lib-dynload','/usr/local/lib/python3.4/dist-packages','/usr/lib/python3/dist-packages']

因此若像我一樣在當前目錄下存在與要引入模組同名的檔案,就會把要引入的模組遮蔽掉。

2  from…import 語句

1frommodnameimportname1[, name2[, ... namen]]

這個宣告不會把整個modulename模組匯入到當前的名稱空間中,只會將它裡面的name1或name2單個引入到執行這個宣告的模組的全域性符號表。

3  from…import* 語句

1frommodnameimport*

這提供了一個簡單的方法來匯入一個模組中的所有專案。然而這種宣告不該被過多地使用。大多數情況, python程式設計師不使用這種方法,因為引入的其它**的命名,很可能覆蓋了已有的定義。

4 執行本質12

#1 import test

#2 from test import add

無論1還是2,首先通過sys.path找到test.py,然後執行test指令碼(全部執行),區別是1會將test這個變數名載入到名字空間,而2只會將add這個變數名載入進來。  

包(package)

如果不同的人編寫的模組名相同怎麼辦?為了避免模組名衝突,python又引入了按目錄來組織模組的方法,稱為包(package)。

舉個例子,一個abc.py的檔案就是一個名字叫abc的模組,一個xyz.py的檔案就是一個名字叫xyz的模組。

現在,假設我們的abcxyz這兩個模組名字與其他模組衝突了,於是我們可以通過包來組織模組,避免衝突。方法是選擇一個頂層包名:

請注意,每一個包目錄下面都會有一個__init__.py的檔案,這個檔案是必須存在的,否則,python就把這個目錄當成普通目錄(資料夾),而不是一個包。__init__.py可以是空檔案,也可以有python**,因為__init__.py本身就是一個模組,而它的模組名就是對應包的名字。

呼叫包就是執行包下的__init__.py檔案

注意點(important)

1--------------12

345importsys,os

base_dir=os.path.dirname(os.path.dirname(os.path.abspath(__file__)))

importhello

hello.hello1()

2 --------------12

if__name__=='__main__':

print('ok')

“make a .py both importable and executable”

如果我們是直接執行某個.py檔案的時候,該檔案中那麼”__name__ == '__main__'“是true,但是我們如果從另外一個.py檔案通過import匯入該檔案的時候,這時__name__的值就是我們這個py檔案的名字而不是__main__。

這個功能還有一個用處:除錯**的時候,在”if __name__ == '__main__'“中加入一些我們的除錯**,我們可以讓外部模組呼叫的時候不執行我們的除錯**,但是如果我們想排查問題的時候,直接執行該模組檔案,除錯**能夠正常執行!s

3   

123456

78910

1112

1314

15##-------------cal.py

defadd(x,y):

returnx+y

##-------------main.py

importcal#from module import cal

defmain():

cal.add(1,2)

##--------------bin.py

frommoduleimportmain

main.main()

注意

Python的模組 包等概念的理解

python 包 模組與檔案系統的對應關係 包 對應於資料夾,模組 檔案 模組搜尋路徑 匯入一個叫 spam 的模組時,直譯器先在當前目錄中...

閉包的概念 轉

首先,我覺得,一個概念,如果不理解也不影響使用的話,那麼,就沒必要去理解它 去學習它。閉包就是這樣一個概念,你不理解它也能很好的用它。俺這兩...

python的包裝和授權

包裝 python為大家提供了標準資料型別,以及豐富的內建方法,其實在很多場景下我們都需要基於標準資料型別來定製我們自己的資料型別,新增 改...