python模組和包
一. 模組
Python 模組(Module),是一個 Python 檔案,以 .py 結尾,包含了 Python 物件定義和Python語句。
模組能定義函式,類和變數,模組裡也能包含可執行的程式碼。
二. 匯入模組
1. 語法:
import 模組名 from 模組名 import 功能名 from 模組名 import * import 模組名 as 別名 from 模組名 import 功能名 as 別名
2. 示例:
2.1 定義模組:
建立mymodule.py檔案,並編寫方法sum,定義變數name:
def sum(a, b): return a+b name= 'mymodule'
2.2 匯入模組:
在demo.py 檔案中匯入並使用sum方法
2.2.1 "import 模組名" 方式匯入模組
import mymodule c = mymodule.sum(1, 2) print(c) # 3
說明:
1.這種方法匯入後,會匯入模組中所有的內容
2. 功能呼叫方法:模組名.功能
2.2.2 "from 模組名 import 功能名"方式匯入模組
from mymodule import sum c = sum(1, 2) print(c) # 3 print(name) # NameError: name 'name' is not defined
說明:
1. 匯入的時sum這個功能,因此呼叫時直接使用sum即可,不需要模組名. 的方式呼叫
2. mymodule模組中定義的其他功能沒有匯入,不可呼叫,如上面的name屬性。
3. 也可在import後面使用逗號分隔匯入多個功能如:
from mymodule import sum, name c = sum(1, 2) print(c) # 3 print(name) # mymodule
4. 如果需要匯入模組所有功能,則import後面使用*號實現
from mymodule import * c = sum(1, 2) print(c) # 3 print(name) # mymodule
2.2.3 給匯入的模組或功能取別名
import mymodule as cal c = cal.sum(1, 2) print(c) # 3
from mymodule import sum as ss c = ss(1, 2) print(c) # 3
說明:取別名後,只能使用別名
三. 自定義模組
在Python中,每個Python檔案都可以作為一個模組,模組的名字就是檔案的名字。也就是說自定義模組名必須要符合識別符號命名規則。
建立一個.py的檔案,並在檔案中定義模組功能,即建立了一個模組,如上面的mymodule就是一個自定義的模組
3.1 模組中的__name__屬性
__name__ 預設值為模組名,當前執行的.py檔案的__name__的值自動被設定為"__main__"
import mymodule print(__name__) # __main__ print(mymodule.__name__) # mymodule
說明
1. 當前執行的檔案,此屬性值為"__main__",而匯入的mymodul模組的此屬性值為模組名:mymodule
2. 一般使用這一特點定義測試程式碼,如在mymodule 中定義測試程式碼:
def sum(a, b): return a+b name = 'mymodule' if __name__ == '__main__': print("測試程式碼")
3. 如果沒有if __name__ == '__main__': 這行程式碼,當通過import mymodule方式匯入模組時,測試程式碼會執行,而使用了這個判斷後,由於在別的模組匯入後,mymodule模組的名稱為mymodule,測試程式碼不會執行
四. 模組定位順序
當匯入一個模組,Python解析器對模組位置的搜尋順序是:
1. 當前目錄
2. 如果不在當前目錄,Python則搜尋在shell變數PYTHONPATH下的每個目錄。
3. 如果都找不到,Python會察看預設路徑。UNIX下,預設路徑一般為/usr/local/lib/python/
模組搜尋路徑儲存在system模組的sys.path變數中。變數裡包含當前目錄,PYTHONPATH和由安裝過程決定的預設目錄。
- 注意
- 自己的檔名不要和已有模組名重複,否則導致模組功能無法使用
- `使用from 模組名 import 功能`的時候,如果功能名字重複,呼叫到的是最後定義或匯入的功能。
from mymodule import sum def sum(a, b): return 100 print(sum(1, 2)) # 100
def sum(a, b): return 100 from mymodule import sum print(sum(1, 2)) # 3
說明:
1.總規則:後定義的會覆蓋先定義的
2.上面程式碼中後匯入mymodule則sum使用的mymodule中的sum,否則使用的是當前檔案的sum
3. import 模組名的時候,不用擔心功能名稱重複,因為是通過模組名.功能的方式呼叫。不過要注意模組名與其他變數名稱重複
五.`__all__`
如果一個模組檔案中有`__all__`變數,當使用`from xxx import *`匯入時,只能匯入這個列表中的元素。
在mymodule中新增`__all__`屬性:
__all__ = ['sum'] #使用字串,而不是變數 def sum(a, b): return a+b name = 'mymodule'
匯入所有功能並呼叫:
from mymodule import * print(sum(1, 2)) # 3 print(name) # NameError: name 'name' is not defined
說明:
1. __all__列表中使用字串,而不是變數
2. 上面的name沒有放在all列表中,因此匯入全部功能後,不包括name
六. 包
1.包
包將有聯絡的模組組織在一起,即放到同一個資料夾下,並且在這個資料夾建立一個名字為`__init__.py` 檔案,那麼這個資料夾就稱之為包。
2.新建包
[New] — [Python Package] — 輸入包名 — [OK] — 新建功能模組(有聯絡的模組)。
注意:新建包後,包內部會自動建立`__init__.py`檔案,這個檔案控制著包的匯入行為。
新建包mypackage和包中的模組mymodule1
def print_m(): print("module1...")
3. 在demo.py中匯入包中的模組
3.1包名.模組名 方式匯入
語法
import 包名.模組名 包名.模組名.目標功能
示例:
import mypackage.mymodule1 mypackage.mymodule1.print_m() # module1...
3.2from 包名 import * 匯入包中的模組
這種方法匯入模組,必須在`__init__.py`檔案中新增`__all__ = []`,控制允許匯入的模組列表。如果列表為空,則無法匯入任何模組
示例:
不在__init__.py中新增__all__列表時:
from mypackage import * mymodule1.print_m() # NameError: name 'mymodule1' is not defined
新增__all__列表並指定可匯入模組:
__all__ = ["mymodule1"]
再次執行:
from mypackage import * mymodule1.print_m() # module1...