1. 程式人生 > 實用技巧 >python模組和包

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...