Python 簡易手冊

單元 67 - 泛型

泛型 (generic) 基本上是定義通用型態,讓函數 (function) 或類別 (class) 在型態標記 (type hint) 的時候,讓程式碼更好閱讀,這需要借助標準程式庫 (standard library) 中的 typing ,以下為簡單例子

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
# 從 typing 引入 TypeVar
from typing import TypeVar

# 設定通用型態
T = TypeVar('T')

# 用通用型態標記
def do_something(p: T) -> T:
    return p

# 執行部分
result = do_something(10)
print(result)

# 檔名: class_demo33.py
# 說明: 《Python簡易手冊》的範例
# 網址: http://kaiching.org
# 作者: Kaiching Chang
# 時間: 2024 年 3 月

其實泛型是強型態程式語言的觀念, Python 由於自動推論型態,就語法上並沒有內建泛型,用 Python 寫程式也不需要用泛型的概念,但還是有開發團隊習慣用泛型的程式設計典範,因此 Python 是由標準程式庫來支援泛型。

單元 44 - 函數與 return 陳述介紹如何定義函數,單元 9 - 型態標記介紹如何做型態標記。

第 2 行從標準程式庫 typing 引入 TypeVar

 1
 2
# 從 typing 引入 TypeVar
from typing import TypeVar

第 5 行用 TypeVar 設定泛型別名型態 T

 4
 5
# 設定通用型態
T = TypeVar('T')

第 8 行用 T 標記函數的參數 (parameter) 與回傳值型態 (return type)

 7
 8
 9
# 用通用型態標記
def do_something(p: T) -> T:
    return p

底下執行部分就是簡單的呼叫函數,然後印出回傳值,執行結果如下

> python class_demo33.py
10
>

也有像是這種寫法, Data 表示都是 int 的串列 (list) , Data2 則是 strint 組成的序對 (tuple)

  
  
Data = List[int]
Data2 = Tuple[str, int]

單元 39 - 串列介紹串列,單元 38 - 序對與 Range介紹序對。

以上 List[int]Tuple[str, int] 都是泛型別名型態,此外內建函數 isinstance()issubclass() 不接受泛型別名型態的引數。

或是類別繼承 (inherit) 自泛型類別,這樣識別字 (identifier) T 在類別定義中就會是通用的泛型類別

  
  
class Demo(Generic[T]):
    ...

單元 62 - 繼承介紹如何定義繼承,單元 49 - pass 陳述與省略符號 ...介紹省略符號 ...

倒是實際寫法上很多細節需要注意,詳細請參考底下的官方文件連結。

參考資料

上一頁 單元 66 - 迭代器
回 Python 簡易手冊 首頁
下一頁 單元 68 - 模組與 import 陳述
回 Python 教材首頁
回程式語言教材首頁