Python - Enums: Hướng Dẫn Cho Người Mới Bắt Đầu

Xin chào các nhà phù thủy Python tương lai! Hôm nay, chúng ta sẽ bắt đầu hành trình thú vị vào thế giới Enums trong Python. Đừng lo lắng nếu bạn chưa từng nghe về Enums - đến cuối bài hướng dẫn này, bạn sẽ sử dụng chúng như một chuyên gia!

Python - Enums

Enums là gì trong Python?

Tưởng tượng bạn đang tạo một trò chơi nơi người chơi có thể chọn các mức độ khó khác nhau. Bạn có thể đại diện cho các mức độ này bằng các chuỗi hoặc số đơn giản, nhưng điều gì xảy ra nếu bạn nhầm chữ hoặc sử dụng một số không hợp lệ? Đó là lúc Enums xuất hiện để cứu bạn!

Một Enum, viết tắt của "enumeration," là một tập hợp các giá trị có tên không thay đổi. Nó giống như một danh sách đặc biệt các tùy chọn xác định trước mà bạn có thể sử dụng trong mã của mình. Hãy bắt đầu với ví dụ đầu tiên của chúng ta:

from enum import Enum

class DifficultyLevel(Enum):
EASY = 1
MEDIUM = 2
HARD = 3

Trong đoạn mã này, chúng ta đang nhập lớp Enum từ mô-đun enum. Sau đó, chúng ta tạo Enum riêng của mình có tên là DifficultyLevel. Nó có ba thành viên: EASY, MEDIUM và HARD, mỗi cái liên kết với một giá trị.

Tại sao sử dụng Enums?

  1. Đọc dễ: Enums làm cho mã của bạn dễ đọc hơn. Thay vì sử dụng các số bí ẩn, bạn có thể sử dụng các tên có ý nghĩa.
  2. An toàn loại: Enums giúp ngăn chặn lỗi bằng cách đảm bảo bạn chỉ sử dụng các giá trị xác định trước.
  3. Tổ chức: Chúng nhóm các hằng số liên quan lại với nhau, làm cho mã của bạn được tổ chức hơn.

Truy cập các Thành Viên trong Enums

Bây giờ đã tạo Enum của mình, hãy xem cách chúng ta có thể sử dụng nó trong mã của mình.

print(DifficultyLevel.EASY)        # Output: DifficultyLevel.EASY
print(DifficultyLevel.EASY.name)   # Output: EASY
print(DifficultyLevel.EASY.value)  # Output: 1

# So sánh các thành viên Enum
print(DifficultyLevel.EASY == DifficultyLevel.MEDIUM)  # Output: False
print(DifficultyLevel.HARD == DifficultyLevel.HARD)    # Output: True

Hãy phân tích:

  • Chúng ta có thể truy cập các thành viên Enum bằng cách sử dụng dấu chấm.
  • Thuộc tính .name mang lại tên của thành viên Enum dưới dạng chuỗi.
  • Thuộc tính .value mang lại giá trị liên kết.
  • Chúng ta có thể so sánh các thành viên Enum bằng cách sử dụng ==.

Dưới đây là một thông tin thú vị: Các thành viên Enum là các đối tượng singleton. Điều này có nghĩa là bất kỳ lúc nào bạn tham chiếu đến DifficultyLevel.EASY, nó luôn là cùng một đối tượng trong bộ nhớ. Nó như có một người bạn tốt nhất luôn ở bên bạn!

Lặp qua Enums

Một trong những điều thú vị nhất về Enums là chúng ta có thể lặp qua chúng. Điều này rất hữu ích khi bạn muốn làm điều gì đó với tất cả các tùy chọn trong Enum của bạn.

for level in DifficultyLevel:
print(f"Độ khó: {level.name}, Giá trị: {level.value}")

# Output:
# Độ khó: EASY, Giá trị: 1
# Độ khó: MEDIUM, Giá trị: 2
# Độ khó: HARD, Giá trị: 3

Đoạn mã này lặp qua tất cả các thành viên của Enum DifficultyLevel của chúng ta, in ra mỗi tên và giá trị. Nó như có một hướng dẫn tham quan thú vị hiển thị tất cả các tùy chọn!

Tính Năng Nâng Cao của Enums

Bây giờ đã bắt đầu với các khái niệm cơ bản, hãy xem những tính năng nâng cao hơn của Enums.

Đánh số tự động

Nếu bạn không muốn gán giá trị thủ công, Python có thể làm điều đó cho bạn:

from enum import Enum, auto

class Direction(Enum):
NORTH = auto()
SOUTH = auto()
EAST = auto()
WEST = auto()

print(list(Direction))  # Output: [<Direction.NORTH: 1>, <Direction.SOUTH: 2>, <Direction.EAST: 3>, <Direction.WEST: 4>]

Hàm auto() tự động gán các giá trị số nguyên tăng dần bắt đầu từ 1.

Sử dụng Enums trong các hàm

Enums rất tốt cho các tham số của hàm. Chúng làm cho các hàm của bạn mạnh mẽ hơn và tự tài liệu hơn:

def set_difficulty(level: DifficultyLevel):
print(f"Độ khó trò chơi được đặt là: {level.name}")

set_difficulty(DifficultyLevel.HARD)  # Output: Độ khó trò chơi được đặt là: HARD
set_difficulty("EASY")  # Điều này sẽ gây ra lỗi TypeError

Bằng cách xác định DifficultyLevel là kiểu dẫn cho tham số level, chúng ta đang nói với Python (và các nhà phát triển khác) rằng hàm này mong đợi một thành viên Enum DifficultyLevel.

Phương thức và thuộc tính của Enum

Dưới đây là bảng các phương thức và thuộc tính Enum hữu ích:

Phương thức/Thuộc tính Mô tả Ví dụ
Enum.name Trả về tên của thành viên Enum DifficultyLevel.EASY.name
Enum.value Trả về giá trị của thành viên Enum DifficultyLevel.EASY.value
Enum.__members__ Từ điển của tất cả các thành viên Enum DifficultyLevel.__members__
Enum(value) Lấy thành viên Enum bằng giá trị DifficultyLevel(1)

Kết Luận

Xin chúc mừng! Bạn vừa nâng cấp kỹ năng Python của mình bằng cách nắm vững Enums. Nhớ rằng, Enums như một chiếc cúp Switzerland trong bộ công cụ mã của bạn - chúng có thể có vẻ đơn giản, nhưng chúng rất linh hoạt và có thể làm cho mã của bạn sạch sẽ, an toàn và dễ đọc hơn.

Lần tới bạn làm dự án và gặp phải việc sử dụng một tập hợp các hằng số liên quan, hãy cân nhắc sử dụng một Enum. Bạn trong tương lai (và các nhà phát triển khác làm việc với mã của bạn) sẽ cảm ơn bạn!

Tiếp tục mã hóa, tiếp tục học hỏi, và nhớ rằng - trong thế giới lập trình, mỗi ngày là cơ hội để liệt kê kỹ năng của bạn! (Hiểu chưa? Enum-erate? Được rồi, tôi sẽ rời khỏi đây ngay bây giờ. ?)

Credits: Image by storyset