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 則是 str 及 int 組成的序對 (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 陳述與省略符號 ...介紹省略符號 ... 。
倒是實際寫法上很多細節需要注意,詳細請參考底下的官方文件連結。