Python Enum so với lớp dữ liệu

Trong bài viết này, bạn sẽ tìm hiểu enums là gì, cách tạo và làm việc với chúng. Hơn nữa, bạn sẽ tìm hiểu lý do tại sao bạn nên sử dụng chúng thường xuyên hơn trong mã hóa hàng ngày của mình

Thông tin

Các đoạn mã được sử dụng trong bài viết có thể được tìm thấy trên GitHub

Enum là gì?

enum là viết tắt của enumeration và đề cập đến một tập hợp các tên tượng trưng, ​​được gọi là thành viên liệt kê. Các thành viên enum này bị ràng buộc với các giá trị không đổi, duy nhất. Bạn có thể lặp lại một phép liệt kê và so sánh các thành viên của nó theo danh tính [toán tử

$ python colour.py
Colour.RED
RED
1
True
False
5 của Python]

Đoạn mã sau đây cho bạn thấy một ví dụ đơn giản về một enum

$ python colour.py
Colour.RED
RED
1
True
False
6

# colour.py

from enum import Enum


class Colour[Enum]:
    RED = 1
    GREEN = 2
    BLUE = 3

Chúng tôi đã nhập lớp

$ python colour.py
Colour.RED
RED
1
True
False
7 từ mô-đun
$ python colour.py
Colour.RED
RED
1
True
False
8 của Python. Nó phục vụ như một lớp cơ sở để xác định kiểu liệt kê mới trong Python. Sau đó, một enum mới gọi là
$ python colour.py
Colour.RED
RED
1
True
False
6 được triển khai có ba thành viên enum.
# iterate.py

from enum import Enum


class Colour[Enum]:
    RED = 1
    GREEN = 2
    BLUE = 3


for name, member in Colour.__members__.items[]:
    print[name, member]
0,
# iterate.py

from enum import Enum


class Colour[Enum]:
    RED = 1
    GREEN = 2
    BLUE = 3


for name, member in Colour.__members__.items[]:
    print[name, member]
1 và
# iterate.py

from enum import Enum


class Colour[Enum]:
    RED = 1
    GREEN = 2
    BLUE = 3


for name, member in Colour.__members__.items[]:
    print[name, member]
2

Ghi chú. Mặc dù cú pháp lớp được sử dụng để xác định kiểu liệt kê mới, nhưng chúng không phải là lớp Python bình thường. Nếu bạn muốn biết thêm về nó, hãy xem Enums khác nhau như thế nào?

Hãy xem cách enums hoạt động khi được sử dụng

# previous colour.py code

c = Colour.RED
print[c]
print[c.name]
print[c.value]
print[c is Colour.RED]
print[c is Colour.BLUE]

Chúng tôi đã mở rộng tập lệnh

# iterate.py

from enum import Enum


class Colour[Enum]:
    RED = 1
    GREEN = 2
    BLUE = 3


for name, member in Colour.__members__.items[]:
    print[name, member]
3 bằng cách tạo một phiên bản mới của
# iterate.py

from enum import Enum


class Colour[Enum]:
    RED = 1
    GREEN = 2
    BLUE = 3


for name, member in Colour.__members__.items[]:
    print[name, member]
4 và gán nó cho biến
# iterate.py

from enum import Enum


class Colour[Enum]:
    RED = 1
    GREEN = 2
    BLUE = 3


for name, member in Colour.__members__.items[]:
    print[name, member]
5. Hơn nữa, chúng tôi in biểu diễn chuỗi của
# iterate.py

from enum import Enum


class Colour[Enum]:
    RED = 1
    GREEN = 2
    BLUE = 3


for name, member in Colour.__members__.items[]:
    print[name, member]
4, tên và giá trị của nó. Ngoài ra, chúng tôi so sánh danh tính của
# iterate.py

from enum import Enum


class Colour[Enum]:
    RED = 1
    GREEN = 2
    BLUE = 3


for name, member in Colour.__members__.items[]:
    print[name, member]
5 với
# iterate.py

from enum import Enum


class Colour[Enum]:
    RED = 1
    GREEN = 2
    BLUE = 3


for name, member in Colour.__members__.items[]:
    print[name, member]
4 và
# iterate.py

from enum import Enum


class Colour[Enum]:
    RED = 1
    GREEN = 2
    BLUE = 3


for name, member in Colour.__members__.items[]:
    print[name, member]
9

$ python colour.py
Colour.RED
RED
1
True
False

Chạy tập lệnh cho thấy rằng

# iterate.py

from enum import Enum


class Colour[Enum]:
    RED = 1
    GREEN = 2
    BLUE = 3


for name, member in Colour.__members__.items[]:
    print[name, member]
5 thực sự là một phiên bản của
# iterate.py

from enum import Enum


class Colour[Enum]:
    RED = 1
    GREEN = 2
    BLUE = 3


for name, member in Colour.__members__.items[]:
    print[name, member]
4 với tên là
# iterate.py

from enum import Enum


class Colour[Enum]:
    RED = 1
    GREEN = 2
    BLUE = 3


for name, member in Colour.__members__.items[]:
    print[name, member]
0 và giá trị là
# colour.py

from enum import Enum


class Colour[Enum]:
    RED = 1
    GREEN = 2
    BLUE = 3
13

Ghi chú. Chúng tôi đã sử dụng toán tử

$ python colour.py
Colour.RED
RED
1
True
False
5 để so sánh biến
# iterate.py

from enum import Enum


class Colour[Enum]:
    RED = 1
    GREEN = 2
    BLUE = 3


for name, member in Colour.__members__.items[]:
    print[name, member]
5 với các thành viên enum khác nhau. Hãy nhớ rằng chỉ có thể so sánh enum với enum chứ không thể so sánh với số nguyên, mặc dù giá trị thành viên enum là số nguyên []

Lặp lại các thành viên của một Enum

Phép liệt kê có một thuộc tính đặc biệt được gọi là

# colour.py

from enum import Enum


class Colour[Enum]:
    RED = 1
    GREEN = 2
    BLUE = 3
16, là ánh xạ tên và thành viên được sắp xếp theo thứ tự chỉ đọc. Việc sử dụng
# colour.py

from enum import Enum


class Colour[Enum]:
    RED = 1
    GREEN = 2
    BLUE = 3
16 cho phép bạn lặp lại một enum và in các thành viên cũng như tên tương ứng của chúng

# iterate.py

from enum import Enum


class Colour[Enum]:
    RED = 1
    GREEN = 2
    BLUE = 3


for name, member in Colour.__members__.items[]:
    print[name, member]
# colour.py

from enum import Enum


class Colour[Enum]:
    RED = 1
    GREEN = 2
    BLUE = 3
1

Bạn có thể tự hỏi tại sao chúng tôi không làm điều gì đó như

# colour.py

from enum import Enum


class Colour[Enum]:
    RED = 1
    GREEN = 2
    BLUE = 3
8

Đối với ví dụ hiện tại, cả hai cách tiếp cận đều tạo ra cùng một kết quả. Tuy nhiên, nếu bạn có một phép liệt kê cũng có bí danh, thì chỉ có cách tiếp cận sử dụng

# colour.py

from enum import Enum


class Colour[Enum]:
    RED = 1
    GREEN = 2
    BLUE = 3
16 mới in ra cả bí danh. Kiểm tra ví dụ sau

$ python colour.py
Colour.RED
RED
1
True
False
0
$ python colour.py
Colour.RED
RED
1
True
False
1

Giá trị tự động

Trong ví dụ trước, chúng tôi đã gán số nguyên cho các tên tượng trưng

# iterate.py

from enum import Enum


class Colour[Enum]:
    RED = 1
    GREEN = 2
    BLUE = 3


for name, member in Colour.__members__.items[]:
    print[name, member]
0,
# iterate.py

from enum import Enum


class Colour[Enum]:
    RED = 1
    GREEN = 2
    BLUE = 3


for name, member in Colour.__members__.items[]:
    print[name, member]
1 và
# iterate.py

from enum import Enum


class Colour[Enum]:
    RED = 1
    GREEN = 2
    BLUE = 3


for name, member in Colour.__members__.items[]:
    print[name, member]
2. Nếu các giá trị chính xác không quan trọng, bạn có thể sử dụng hàm
# colour.py

from enum import Enum


class Colour[Enum]:
    RED = 1
    GREEN = 2
    BLUE = 3
82. Hàm gọi nội bộ
# colour.py

from enum import Enum


class Colour[Enum]:
    RED = 1
    GREEN = 2
    BLUE = 3
83 và tạo các giá trị cho bạn

$ python colour.py
Colour.RED
RED
1
True
False
7

Nó chọn một giá trị phù hợp cho từng thành viên enum, sẽ [hầu hết thời gian] là các số nguyên mà chúng ta đã sử dụng trước đây

$ python colour.py
Colour.RED
RED
1
True
False
8

Tuy nhiên, chức năng

# colour.py

from enum import Enum


class Colour[Enum]:
    RED = 1
    GREEN = 2
    BLUE = 3
83 có thể được ghi đè để tạo ra các giá trị mới theo cách bạn muốn

# previous colour.py code

c = Colour.RED
print[c]
print[c.name]
print[c.value]
print[c is Colour.RED]
print[c is Colour.BLUE]
0
# previous colour.py code

c = Colour.RED
print[c]
print[c.name]
print[c.value]
print[c is Colour.RED]
print[c is Colour.BLUE]
1

Mở rộng một Enum

Là các lớp Python, enums có thể có bất kỳ phương thức [đặc biệt] nào giống như tất cả các lớp khác. Xem xét ví dụ sau

# previous colour.py code

c = Colour.RED
print[c]
print[c.name]
print[c.value]
print[c is Colour.RED]
print[c is Colour.BLUE]
2

Chúng tôi đã mở rộng

$ python colour.py
Colour.RED
RED
1
True
False
6 enum bằng phương pháp mới
# colour.py

from enum import Enum


class Colour[Enum]:
    RED = 1
    GREEN = 2
    BLUE = 3
86 in một chuỗi được tạo dựa trên giá trị của thành viên. Hơn nữa, chúng tôi ghi đè lên phương pháp dunder của
# colour.py

from enum import Enum


class Colour[Enum]:
    RED = 1
    GREEN = 2
    BLUE = 3
87 để trả về tên của thành viên nếu được gọi

# previous colour.py code

c = Colour.RED
print[c]
print[c.name]
print[c.value]
print[c is Colour.RED]
print[c is Colour.BLUE]
3

Các loại Enums trong Python

Bên cạnh

$ python colour.py
Colour.RED
RED
1
True
False
7, Python cung cấp ba kiểu liệt kê dẫn xuất sẵn có

  • # colour.py
    
    from enum import Enum
    
    
    class Colour[Enum]:
        RED = 1
        GREEN = 2
        BLUE = 3
    
    89
  • $ python colour.py
    Colour.RED
    RED
    1
    True
    False
    
    00
  • $ python colour.py
    Colour.RED
    RED
    1
    True
    False
    
    01

Chúng tôi sẽ xem xét cả ba người trong số họ. Hãy nhớ rằng bạn có thể tự do triển khai các phép liệt kê dẫn xuất của riêng mình dựa trên

$ python colour.py
Colour.RED
RED
1
True
False
7. Việc triển khai kiểu liệt kê của riêng bạn sẽ không được đề cập trong bài viết

# colour.py

from enum import Enum


class Colour[Enum]:
    RED = 1
    GREEN = 2
    BLUE = 3
89

Chúng tôi đã biết rằng chúng tôi có thể so sánh các thành viên enum bằng toán tử nhận dạng của Python. Tuy nhiên, lớp

$ python colour.py
Colour.RED
RED
1
True
False
7 không cung cấp các phép so sánh theo thứ tự mặc dù các số nguyên được sử dụng làm giá trị cho các phần tử liệt kê. Hãy cùng xem ví dụ sau

# previous colour.py code

c = Colour.RED
print[c]
print[c.name]
print[c.value]
print[c is Colour.RED]
print[c is Colour.BLUE]
4

Thực thi tập lệnh trong tay dẫn đến một

$ python colour.py
Colour.RED
RED
1
True
False
05

# previous colour.py code

c = Colour.RED
print[c]
print[c.name]
print[c.value]
print[c is Colour.RED]
print[c is Colour.BLUE]
5

Điều duy nhất bạn có thể làm là sử dụng các phép so sánh bình đẳng như

$ python colour.py
Colour.RED
RED
1
True
False
06 và
$ python colour.py
Colour.RED
RED
1
True
False
07. Ngoài ra, không hỗ trợ so sánh các thành viên enum với bất kỳ giá trị không liệt kê nào

Tuy nhiên, kiểu liệt kê dẫn xuất

# colour.py

from enum import Enum


class Colour[Enum]:
    RED = 1
    GREEN = 2
    BLUE = 3
89 không cung cấp các phép so sánh có thứ tự vì nó cũng là một lớp con của
$ python colour.py
Colour.RED
RED
1
True
False
09. Để làm cho ví dụ của chúng tôi hoạt động, chúng tôi cần nhập lớp
# colour.py

from enum import Enum


class Colour[Enum]:
    RED = 1
    GREEN = 2
    BLUE = 3
89 thay vì
$ python colour.py
Colour.RED
RED
1
True
False
7 và lấy
$ python colour.py
Colour.RED
RED
1
True
False
6 từ lớp đó. Chúng tôi không cần phải thay đổi bất cứ điều gì khác

# previous colour.py code

c = Colour.RED
print[c]
print[c.name]
print[c.value]
print[c is Colour.RED]
print[c is Colour.BLUE]
6
# previous colour.py code

c = Colour.RED
print[c]
print[c.name]
print[c.value]
print[c is Colour.RED]
print[c is Colour.BLUE]
7

$ python colour.py
Colour.RED
RED
1
True
False
00

Lớp

$ python colour.py
Colour.RED
RED
1
True
False
00 khá giống với lớp
# colour.py

from enum import Enum


class Colour[Enum]:
    RED = 1
    GREEN = 2
    BLUE = 3
89, ngoại trừ lớp này cũng hỗ trợ các thao tác theo bit. Với việc hỗ trợ các hoạt động bitwise, ý tôi là có thể kết hợp hai thành viên enum dẫn đến thành viên
$ python colour.py
Colour.RED
RED
1
True
False
00. Tất cả các hoạt động khác trên thành viên
$ python colour.py
Colour.RED
RED
1
True
False
00 sẽ dẫn đến việc mất tư cách thành viên
$ python colour.py
Colour.RED
RED
1
True
False
00

Hãy xem một ví dụ. Giả sử rằng chúng tôi cấp quyền cho người dùng để họ có thể đọc, viết và/hoặc thực thi một tệp nhất định. Chúng tôi tạo một liệt kê

$ python colour.py
Colour.RED
RED
1
True
False
19 với các thành viên lần lượt là
$ python colour.py
Colour.RED
RED
1
True
False
70 [quyền đọc],
$ python colour.py
Colour.RED
RED
1
True
False
71 [quyền ghi] và
$ python colour.py
Colour.RED
RED
1
True
False
72 [quyền thực thi]

Nếu chúng tôi có một người dùng, người này phải có quyền đọc và ghi đối với một tệp nhất định, chúng tôi có thể kết hợp cả hai bằng cách sử dụng toán tử

$ python colour.py
Colour.RED
RED
1
True
False
73

# previous colour.py code

c = Colour.RED
print[c]
print[c.name]
print[c.value]
print[c is Colour.RED]
print[c is Colour.BLUE]
8
# previous colour.py code

c = Colour.RED
print[c]
print[c.name]
print[c.value]
print[c is Colour.RED]
print[c is Colour.BLUE]
9

$ python colour.py
Colour.RED
RED
1
True
False
01

Lớp

$ python colour.py
Colour.RED
RED
1
True
False
01 cũng cung cấp hỗ trợ cho các hoạt động theo bit nhưng không kế thừa từ
$ python colour.py
Colour.RED
RED
1
True
False
09. Trên thực tế, nó giống như
$ python colour.py
Colour.RED
RED
1
True
False
7 nhưng có hỗ trợ cho các hoạt động theo bit

Nếu chúng ta lấy

$ python colour.py
Colour.RED
RED
1
True
False
6 enum ngay từ đầu, chúng ta có thể dễ dàng trộn màu trắng dựa trên ba màu còn lại

$ python colour.py
Colour.RED
RED
1
True
False
0
$ python colour.py
Colour.RED
RED
1
True
False
1

Tại sao tôi cần Enum?

Tại thời điểm này, chúng ta đã hiểu enums là gì và cách chúng ta có thể tạo chúng trong Python. Hơn nữa, chúng tôi có thể so sánh và làm việc với họ. Tuy nhiên, chúng ta vẫn chưa biết tại sao chúng ta cần và nên sử dụng kiểu liệt kê thường xuyên hơn

Các ví dụ chúng tôi đã xem khá đơn giản. Mặc dù kiểu liệt kê

$ python colour.py
Colour.RED
RED
1
True
False
19 có vẻ khá hữu ích nhưng kiểu liệt kê
$ python colour.py
Colour.RED
RED
1
True
False
6 thì không. Tại sao bạn lại sử dụng các bảng liệt kê này trong mã của mình?

Hãy xem đoạn mã Python sau

$ python colour.py
Colour.RED
RED
1
True
False
2

Chúng ta đã định nghĩa một hàm, lấy một đối tượng

$ python colour.py
Colour.RED
RED
1
True
False
81 và trả về một chuỗi dựa trên mã trạng thái của đối tượng
$ python colour.py
Colour.RED
RED
1
True
False
81 được cung cấp. Bạn có thể biết rằng 404 là mã trạng thái của Không tìm thấy, nhưng bạn có biết ý nghĩa của 502 và 400 không?

Đây chỉ là hai mã trạng thái ít được biết đến và còn nhiều mã khác nữa. Thật khó để đọc và hiểu mã nếu không tìm kiếm trên web. Đây là nơi liệt kê phát huy tác dụng. Chúng ta có thể triển khai phép liệt kê tùy chỉnh của riêng mình để mang lại nhiều ý nghĩa hơn cho mã

$ python colour.py
Colour.RED
RED
1
True
False
3

Ở đây, một

# colour.py

from enum import Enum


class Colour[Enum]:
    RED = 1
    GREEN = 2
    BLUE = 3
89 được sử dụng vì chúng tôi muốn có thể so sánh các phần tử của nó với các số nguyên. Bây giờ, chức năng từ trước trông như thế này

$ python colour.py
Colour.RED
RED
1
True
False
4

Về bản chất, nếu bạn có các số ma thuật trong mã của mình, bạn chắc chắn nên cân nhắc gán chúng cho một biến hoặc nhóm chúng lại với nhau thành một phép liệt kê. Bằng cách này, khả năng đọc mã của bạn tăng lên rất nhiều. Điều này đặc biệt đúng nếu bạn muốn viết bài kiểm tra cho mã của mình

Thông tin

Ví dụ

$ python colour.py
Colour.RED
RED
1
True
False
84 được sử dụng để minh họa, trong đó enum hữu ích. Tuy nhiên, trong một kịch bản thực tế, bạn không cần tạo một bảng liệt kê
$ python colour.py
Colour.RED
RED
1
True
False
84 tùy chỉnh vì một bảng liệt kê được bao gồm trong mô-đun http. Nó được đặt tên là
$ python colour.py
Colour.RED
RED
1
True
False
86. là một liên kết đến phần tài liệu Python tương ứng

Tóm lược

Xin chúc mừng, bạn đã thực hiện nó thông qua bài viết. Trong khi đọc bài viết, bạn đã biết enums là gì và cách bạn có thể tạo chúng trong Python. Hơn nữa, bạn đã học cách so sánh và làm việc với chúng. Bạn đã xem qua một số ví dụ và hiểu tại sao thỉnh thoảng nên sử dụng kiểu liệt kê

Tôi hy vọng bạn thích đọc bài viết. Hãy chia sẻ nó với bạn bè và đồng nghiệp của bạn. Bạn có thông tin phản hồi? . Bạn có thể liên hệ với tôi qua biểu mẫu liên hệ hoặc các nguồn khác được liệt kê trong phần liên hệ

Nếu bạn chưa có, hãy cân nhắc theo dõi tôi trên Twitter, nơi tôi là @DahlitzF hoặc đăng ký nhận bản tin của tôi. Luôn tò mò và tiếp tục viết mã

Bạn có nên sử dụng enums trong Python?

Nói chung, bạn có thể sử dụng enum bất cứ khi nào bạn có một biến có thể nhận một trong số các giá trị có thể có giới hạn . Python không có kiểu dữ liệu enum như một phần cú pháp của nó. May mắn thay, Python 3. 4 đã thêm mô-đun enum vào thư viện chuẩn.

Tại sao nên sử dụng enum thay vì dict Python?

Enum được sử dụng để tạo một tập hợp các hằng số liên quan . Từ điển được sử dụng để lưu trữ các giá trị dữ liệu trong khóa. cặp giá trị. Enum tương tự như một mảng. Từ điển không cho phép trùng lặp.

Một enum trong Python là gì?

Mã nguồn. Lib/enum. py. Một phép liệt kê là một tập hợp các tên tượng trưng [thành viên] được liên kết với các giá trị không đổi, duy nhất . Trong một phép liệt kê, các thành viên có thể được so sánh bằng danh tính và bản thân phép liệt kê có thể được lặp lại.

Là lớp enum hay kiểu dữ liệu?

Kiểu enum là kiểu dữ liệu đặc biệt cho phép một biến trở thành một tập hợp các hằng số được xác định trước.

Chủ Đề