2009-03-31 39 views
114

thể trùng lặp:
How can I represent an 'enum' in Python?Thực hành phổ biến cho enums trong Python là gì?

những thực tế phổ biến cho sự đếm bằng Python là gì? I E. chúng được sao chép bằng Python như thế nào?

public enum Materials 
{ 
    Shaded, 
    Shiny, 
    Transparent, 
    Matte 
} 
+11

Bây giờ có loại Enum chuẩn trong Python 3.4. Đọc bài đăng này: http://stackoverflow.com/questions/16653129/future-compatible-enums-in-2-7 – Javier

+2

Đây là PEP cho loại enum hiện có trong Python: https: //www.python. org/dev/peps/pep-0435/ – shuttle87

Trả lời

329
class Materials: 
    Shaded, Shiny, Transparent, Matte = range(4) 

>>> print Materials.Matte 
3 
+14

Tôi chưa từng thấy điều đó trước đây, những thứ hay. –

+0

Mẹo hay, cảm ơn. –

+0

Vấn đề duy nhất là tôi cần mục đầu tiên là 1. Có thể thực hiện với phương pháp của bạn không? –

17

Tôi đã nhìn thấy mô hình này nhiều lần:

>>> class Enumeration(object): 
     def __init__(self, names): # or *names, with no .split() 
      for number, name in enumerate(names.split()): 
       setattr(self, name, number) 

>>> foo = Enumeration("bar baz quux") 
>>> foo.quux 
2 

Bạn cũng có thể chỉ cần sử dụng các thành viên lớp, mặc dù bạn sẽ phải cung cấp số của riêng bạn:

>>> class Foo(object): 
     bar = 0 
     baz = 1 
     quux = 2 

>>> Foo.quux 
2 

Nếu bạn đang tìm kiếm thứ gì đó mạnh mẽ hơn (giá trị thưa thớt, ngoại lệ cụ thể cho từng trường hợp, v.v.), try this recipe.

8

Tôi không biết tại sao Enums không hỗ trợ nguyên gốc bằng Python. Cách tốt nhất tôi đã tìm thấy để mô phỏng chúng là bằng cách overridding _ str _ và _ eq _ để bạn có thể so sánh chúng và khi bạn sử dụng print() bạn nhận được chuỗi thay vì giá trị số.

class enumSeason(): 
    Spring = 0 
    Summer = 1 
    Fall = 2 
    Winter = 3 
    def __init__(self, Type): 
     self.value = Type 
    def __str__(self): 
     if self.value == enumSeason.Spring: 
      return 'Spring' 
     if self.value == enumSeason.Summer: 
      return 'Summer' 
     if self.value == enumSeason.Fall: 
      return 'Fall' 
     if self.value == enumSeason.Winter: 
      return 'Winter' 
    def __eq__(self,y): 
     return self.value==y.value 

Cách sử dụng:

>>> s = enumSeason(enumSeason.Spring) 

>>> print(s) 

Spring 
+4

PEP354 có thông báo từ chối. Xem http://www.python.org/dev/peps/pep-0354/#rejection-notice –

+4

Sẽ nhanh hơn để có từ điển lớp học {"Mùa xuân": 0, "Mùa hè": 1, ...} và sử dụng __init__ để lặp qua các mục và đặt thuộc tính, vì sau đó __str__ chỉ có thể xem xét giá trị lên thay vì được mã hóa bằng tay cho mọi trường hợp. –

+1

Xem phần này: https://www.python.org/dev/peps/pep-0435/ – shuttle87

6

Bạn có thể có thể sử dụng một cấu trúc thừa kế mặc dù tôi càng chơi với này bẩn hơn tôi cảm thấy.

class AnimalEnum: 
    @classmethod 
    def verify(cls, other): 
    return issubclass(other.__class__, cls) 


class Dog(AnimalEnum): 
    pass 

def do_something(thing_that_should_be_an_enum): 
    if not AnimalEnum.verify(thing_that_should_be_an_enum): 
    raise OhGodWhy 
Các vấn đề liên quan