Trong Python, generics là một cơ chế cho phép bạn định nghĩa các hàm, lớp hoặc phương thức có thể hoạt động trên nhiều kiểu dữ liệu khác nhau trong khi vẫn duy trì tính an toàn về kiểu. Với việc triển khai Generics, bạn có thể viết mã tái sử dụng có thể sử dụng với các kiểu dữ liệu khác nhau. Điều này đảm bảo thúc đẩy tính linh hoạt của mã và tính chính xác về kiểu.
Thông thường, trong lập trình Python, bạn không cần phải khai báo kiểu biến. Kiểu được xác định động bởi giá trị được gán cho nó. Trình thông dịch của Python không thực hiện kiểm tra kiểu và do đó có thể gây ra các ngoại lệ tại thời điểm chạy.
Python đã giới thiệu generics với type hints trong phiên bản 3.5, cho phép bạn chỉ định các kiểu dữ liệu mong đợi của biến, tham số hàm và giá trị trả về. Tính năng này giúp giảm lỗi thời gian chạy và cải thiện khả năng đọc hiểu của mã.
Generics mở rộng khái niệm gợi ý kiểu bằng cách giới thiệu các biến kiểu, đại diện cho các kiểu tổng quát có thể được thay thế bằng các kiểu cụ thể khi sử dụng hàm hoặc lớp tổng quát.
Hãy cùng xem ví dụ sau đây định nghĩa một hàm tổng quát −
from typing import List, TypeVar, Generic T = TypeVar('T') def reverse(items: List[T]) -> List[T]: return items[::-1]
Ở đây, chúng ta định nghĩa một hàm tổng quát gọi là 'reverse'. Hàm này nhận một danh sách ('List[T]') làm tham số và trả về một danh sách cùng loại. Biến kiểu 'T' đại diện cho kiểu tổng quát, sẽ được thay thế bằng một kiểu cụ thể khi hàm được sử dụng.
Hàm reverse() được gọi với các kiểu dữ liệu khác nhau −
numbers = [1, 2, 3, 4, 5] reversed_numbers = reverse(numbers) print(reversed_numbers) fruits = ['apple', 'banana', 'cherry'] reversed_fruits = reverse(fruits) print(reversed_fruits)
Nó sẽ tạo ra output −
[5, 4, 3, 2, 1] ['cherry', 'banana', 'apple']
Một kiểu tổng quát thường được khai báo bằng cách thêm một danh sách các tham số kiểu sau tên lớp. Ví dụ sau sử dụng kiểu tổng quát với một lớp tổng quát −
from typing import List, TypeVar, Generic T = TypeVar('T') class Box(Generic[T]): def __init__(self, item: T): self.item = item def get_item(self) -> T: return self.item Let us create objects of the above generic class with int and str type box1 = Box(42) print(box1.get_item()) box2 = Box('Hello') print(box2.get_item())
Nó sẽ tạo ra output −
42 Hello