Mục đích của Enums là gì? Họ tạo ra giá trị nào cho ngôn ngữ? Khi nào tôi nên sử dụng chúng và khi nào tôi nên tránh chúng?
Loại enum đã vào Python thông qua PEP 435. Lý do được đưa ra là:
Các thuộc tính của một liệt kê rất hữu ích để xác định một tập hợp các giá trị không đổi liên quan, có thể có ý nghĩa ngữ nghĩa.
Khi sử dụng số và chuỗi cho mục đích này, chúng có thể được đặc trưng là "số ma thuật" hoặc "chuỗi ma thuật". Những con số hiếm khi mang theo chúng là ngữ nghĩa, và dây dễ bị nhầm lẫn [viết hoa?
Ngày trong tuần và các lớp thư của trường là ví dụ về loại bộ sưu tập giá trị này.
Đây là một ví dụ từ các tài liệu:
from enum import Enum
class Color[Enum]:
red = 1
green = 2
blue = 3
Giống như lớp trần, điều này dễ đọc và thanh lịch hơn nhiều so với ví dụ được đặt tên, nó cũng không thay đổi, và nó có thêm lợi ích như chúng ta sẽ thấy dưới đây.
Thống lĩnh nghiêm ngặt: loại thành viên enum là enum
>>> type[Color.red]
>>> isinstance[Color.green, Color]
True
Điều này cho phép bạn xác định chức năng trên các thành viên trong định nghĩa enum. Xác định chức năng trên các giá trị có thể được thực hiện bằng các phương pháp trước đó, nhưng nó sẽ rất không phù hợp.
Cải thiện: cưỡng chế chuỗi
Biểu diễn chuỗi có thể đọc được của con người, trong khi repr có thêm thông tin:
>>> print[Color.red]
Color.red
>>> print[repr[Color.red]]
Tôi thấy đây là một sự cải thiện so với các số ma thuật và thậm chí có thể tốt hơn các chuỗi từ tên gọi.
Lặp đi lặp lại [tương đương]:
Enum hỗ trợ lặp lại [như tên được đặt tên, nhưng không quá nhiều lớp trần] cũng vậy:
>>> for color in Color:
print[color]
Color.red
Color.green
Color.blue
Thuộc tính
>>> type[Color.red]
>>> isinstance[Color.green, Color]
True
1 là một ánh xạ theo thứ tự các tên của các enum cho các đối tượng enum tương ứng của chúng [tương tự như hàm >>> type[Color.red]
>>> isinstance[Color.green, Color]
True
2 của tên gọi].>>> Color.__members__
mappingproxy[OrderedDict[[['red', ], ['green', ],
['blue', ]]]]
Được hỗ trợ bởi Pickle [Parity]
Bạn có thể tuần tự hóa và giải phóng enum [trong trường hợp bất cứ ai lo lắng về điều này]:
>>> import pickle
>>> color.red is pickle.loads[pickle.dumps[color.red]]
True
Cải thiện: Bí danh
Đây là một tính năng hay mà lớp học không có, và sẽ rất khó để nói bí danh ở đó trong
>>> type[Color.red]
>>> isinstance[Color.green, Color]
True
3.class Color[Enum]:
red = 1
green = 2
blue = 3
really_blue = 3
Bí danh xuất hiện theo tên kinh điển, nhưng cả hai đều giống nhau:
>>> Color.blue is Color.really_blue
True
Nếu các bí danh nên bị cấm để tránh va chạm giá trị, hãy sử dụng trình trang trí
>>> type[Color.red]
>>> isinstance[Color.green, Color]
True
4 [một tính năng chiếm ưu thế].Thống lĩnh nghiêm ngặt: So sánh được thực hiện với >>> type[Color.red]
>>> isinstance[Color.green, Color]
True
5
>>> type[Color.red]
>>> isinstance[Color.green, Color]
True
Enum được dự định sẽ được kiểm tra với
>>> type[Color.red]
>>> isinstance[Color.green, Color]
True
5, đây là một kiểm tra nhanh cho danh tính của một đối tượng trong quy trình.>>> Color.red is Color.red
True
>>> Color.red is Color.blue
False
>>> Color.red is not Color.blue
True
Các bài kiểm tra cho bình đẳng cũng hoạt động, nhưng các bài kiểm tra về danh tính với
>>> type[Color.red]
>>> isinstance[Color.green, Color]
True
5 là tối ưu.Các ngữ nghĩa khác nhau từ các lớp Python khác
Các lớp enum có ngữ nghĩa khác nhau từ các loại python thông thường. Các giá trị của enum là các trường hợp của enum và là những người độc thân trong bộ nhớ cho các giá trị đó - không có mục đích nào khác để khởi tạo chúng.
>>> Color.red is Color[1]
Điều này rất quan trọng để ghi nhớ, có lẽ đó là một nhược điểm, nhưng so sánh về chiều này là so sánh táo với cam.
Enums không được cho là được đặt hàng
Mặc dù lớp Enum biết những thứ tự được tạo ra, các enum không được cho là được đặt hàng. Đây là một tính năng bởi vì nhiều điều có thể được liệt kê không có trật tự tự nhiên, và do đó trật tự sẽ là tùy ý.
Tuy nhiên, bạn có thể đặt hàng Enums của bạn [xem phần tiếp theo].
Lớp con
Bạn không thể phân lớp một enum với các thành viên được tuyên bố, nhưng bạn có thể phân lớp một enum không tuyên bố các thành viên chia sẻ hành vi [xem công thức đặt hàng trong tài liệu].
Đây là một tính năng - rất ít có ý nghĩa khi phân lớp một enum với các thành viên, nhưng một lần nữa, so sánh là táo và cam.
Khi nào tôi nên sử dụng >>> type[Color.red]
>>> isinstance[Color.green, Color]
True
8?
>>> type[Color.red]
>>> isinstance[Color.green, Color]
True
Đây là sự liệt kê kinh điển mới trong Python. Các cộng tác viên sẽ hy vọng các enum của bạn sẽ hành xử như những enum này.
Sử dụng nó bất cứ nơi nào bạn có một nguồn dữ liệu được liệt kê trong mã của bạn, nơi bạn muốn được chỉ định rõ ràng để sử dụng tên chính tắc, thay vì dữ liệu tùy ý.
Ví dụ: nếu trong mã của bạn, bạn muốn người dùng nói rằng đó không phải là
>>> type[Color.red]
>>> isinstance[Color.green, Color]
True
9, >>> print[Color.red]
Color.red
>>> print[repr[Color.red]]
0, 2 hoặc >>> print[Color.red]
Color.red
>>> print[repr[Color.red]]
1, mà là >>> print[Color.red]
Color.red
>>> print[repr[Color.red]]
2 - sử dụng đối tượng enum.enum. Nó vừa rõ ràng và cụ thể.Có rất nhiều ví dụ và công thức nấu ăn trong tài liệu.
Khi nào tôi nên tránh chúng?
Ngừng tự lăn hoặc để mọi người đoán về số ma thuật và chuỗi. Đừng tránh chúng. Nắm lấy chúng.
Tuy nhiên, nếu các thành viên enum của bạn được yêu cầu là số nguyên vì lý do lịch sử, thì có
>>> print[Color.red]
Color.red
>>> print[repr[Color.red]]
3 từ cùng một mô -đun, có cùng một hành vi, nhưng cũng là một số nguyên vì nó phân lớp >>> print[Color.red]
Color.red
>>> print[repr[Color.red]]
4 tích hợp trước khi phân lớp >>> print[Color.red]
Color.red
>>> print[repr[Color.red]]
5. Từ ____ ____ 23 sự giúp đỡ:>>> type[Color.red]
>>> isinstance[Color.green, Color]
True
0Chúng ta có thể thấy rằng các giá trị intenum sẽ kiểm tra như một ví dụ của
>>> print[Color.red]
Color.red
>>> print[repr[Color.red]]
4.