以下是原文翻译成繁體中文的Markdown格式內容:

Python - Generics

# Python 泛型:初學者的指南

你好,未來的Python大師!今天,我們將要踏上一段令人興奮的旅程,探索Python泛型的世界。別擔心你對編程是新手——我將成為你的友好導遊,一步步地解釋一切。那麼,拿起你喜歡的飲料,讓我們一起進入吧!

## 什麼是泛型?

在我們開始編程之前,讓我們先了解泛型是什麼。想像你有一個神奇的盒子,它可以存放任何類型的物品——玩具、書籍,甚至是cookies。這基本上就是編程中泛型的作用。它們讓我們能夠編寫出能夠應用於不同數據類型的靈活代碼。

## 定義一個泛型函數

讓我們從創建一個泛型函數開始。在Python中,我們使用`typing`模塊中的`TypeVar`來定義泛型類型。

```python
from typing import TypeVar

T = TypeVar('T')

def print_item(item: T) -> None:
    print(f"物品是: {item}")

在這個例子中,T是我們的泛型類型。print_item函數現在可以接受任何類型的數據。讓我們分解一下:

  1. 我們從typing模塊中導入TypeVar
  2. 我們創建一個類型變量T
  3. 我們的函數print_item接受一個類型為T的參數item
  4. 函數簡單地打印出物品。

使用不同數據類型調用泛型函數

現在,讓我們看看我們的泛型函數實際運行的情況!

print_item(42)
print_item("Hello, Generics!")
print_item([1, 2, 3])

輸出:

物品是: 42
物品是: Hello, Generics!
物品是: [1, 2, 3]

正如你所看到的,我們的函數可以與不同類型的數據一起工作——整數、字符串,甚至是列表。這就像在你的代碼工具包中有一把瑞士軍刀!

定義一個泛型類

既然我們已經掌握了泛型函數,讓我們升級遊戲,創建一個泛型類。想像我們正在構建一個簡單的存儲系統,它可以存放任何類型的物品。

from typing import Generic, TypeVar

T = TypeVar('T')

class Box(Generic[T]):
    def __init__(self, item: T):
        self.item = item

    def get_item(self) -> T:
        return self.item

    def set_item(self, new_item: T) -> None:
        self.item = new_item

讓我們分解這個神奇的Box:

  1. 我們將我們的類Box定義為Generic[T]
  2. __init__方法接受一個類型為Titem
  3. get_item返回存儲的物品。
  4. set_item允許我們更改物品。

現在,讓我們使用我們的Box:

# 整數的盒子
int_box = Box(42)
print(int_box.get_item())  # 輸出: 42

# 字符串的盒子
str_box = Box("Hello, Generic Class!")
print(str_box.get_item())  # 輸出: Hello, Generic Class!

# 更改盒子中的物品
int_box.set_item(100)
print(int_box.get_item())  # 輸出: 100

這不是很有趣嗎?我們可以創建存儲不同類型物品的盒子,而Python為我們確保了類型安全。

泛型的力量

泛型可能一開始看起來有點抽象,但它們非常強大。它們讓我們能夠編寫既靈活又類型安全的代碼。想像你正在構建一個大型應用程序——泛型可以幫助你創建有用的組件,這些組件可以與各種數據類型一起工作,節省你的時間並減少錯誤。

這裡有一個更複雜的例子來說明這種力量:

from typing import Generic, TypeVar, List

T = TypeVar('T')

class Storage(Generic[T]):
    def __init__(self):
        self.items: List[T] = []

    def add_item(self, item: T) -> None:
        self.items.append(item)

    def get_items(self) -> List[T]:
        return self.items

    def get_last_item(self) -> T:
        if self.items:
            return self.items[-1]
        raise IndexError("Storage is empty")

# 使用我們的泛型Storage類
int_storage = Storage[int]()
int_storage.add_item(1)
int_storage.add_item(2)
int_storage.add_item(3)

str_storage = Storage[str]()
str_storage.add_item("Apple")
str_storage.add_item("Banana")
str_storage.add_item("Cherry")

print(int_storage.get_items())  # 輸出: [1, 2, 3]
print(str_storage.get_last_item())  # 輸出: Cherry

在這個例子中,我們創建了一個泛型Storage類,它可以存儲任何類型的列表。然後我們為整數和字符串創建了分別的存儲,展示了我們泛型類的靈活性。

結論

恭喜你!你剛剛踏出了進入Python泛型世界的第一步。我們已經介紹了泛型函數、泛型類,甚至建立了一個靈活的存儲系統。記住,像任何強大的工具一樣,泛型需要練習才能精通。如果它們立即沒有對你產生共鳴——別氣餒,持續實驗,你很快就會在自己的代碼中看到泛型的魔力。

當我們結束時,這裡是一個總結我們學到的關鍵方法的表格:

方法 描述
TypeVar('T') 創建一個泛型用途的類型變量
Generic[T] 定義一個泛型類
__init__(self, item: T) 使用類型為T的物品初始化泛型類
get_item(self) -> T 返回類型為T的物品
set_item(self, new_item: T) -> None 設置一個類型為T的新物品
add_item(self, item: T) -> None 將類型為T的物品添加到集合中
get_items(self) -> List[T] 返回類型為T的物品列表
get_last_item(self) -> T 返回集合中類型為T的最後一個物品

繼續編碼,持續學習,並記住——有了泛型,你的Python力量是無窮的!祝編碼愉快,未來的Python法師!

Credits: Image by storyset