2009-03-31 17 views
114

Olası Çoğalt:
How can I represent an 'enum' in Python?Python'daki enumlar için yaygın uygulama nedir?

Python çeteleler için yaygın bir uygulama nedir? Yani Python'da nasıl çoğaltıyorlar?

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

Şimdi Python 3.4 standart Enum türü yoktur. Bu gönderiyi okuyun: http://stackoverflow.com/questions/16653129/future-compatible-enums-in-2-7 – Javier

+2

Python: https: //www.python adresinde bulunan enum türü için PEP İşte. org/dev/peps/pep-0435/ – shuttle87

cevap

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

>>> print Materials.Matte 
3 
+14

Bunu daha önce hiç görmedim, iyi şeyler. –

+0

İyi bahşiş, teşekkürler. –

+0

Tek sorun, ilk öğenin 1 olması gerektiğidir. Bu, yönteminizle mümkün mü? –

17

Bu desen gördüğüm birkaç kez:

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

>>> Foo.quux 
2 

ise: Kendi numaralandırma kaynağı gerekecek olsa da sadece, sınıf üyelerini kullanabilirsiniz

>>> 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 

Daha sağlam bir şey (seyrek değerler, enum-özel istisna, vb.), try this recipe'u arıyoruz.

8

Enumların neden Python tarafından yerel olarak desteklenmedikleri konusunda hiçbir fikrim yok. Onları taklit etmenin en iyi yolu _ str _ ve _ eq _ 'ü geçersiz kılmaktır, böylece bunları karşılaştırabilirsiniz ve print() kullandığınızda, sayısal değer yerine dize alırsınız.

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 

Kullanımı: daha ben hissettim bu kirli ile oynanan rağmen

>>> s = enumSeason(enumSeason.Spring) 

>>> print(s) 

Spring 
+4

PEP354’ün reddetme uyarısı var. Bkz. Http://www.python.org/dev/peps/pep-0354/#rejection-notice –

+4

Bir sınıf sözlüğüne sahip olmak daha hızlı olurdu {"Spring": 0, "Yaz": 1, ...} ve girişler arasında yineleme yapmak ve öznitelikler ayarlamak için __init__ kullanın, çünkü __str__ her bir durum için el ile kodlanmaktan ziyade değeri yukarı bakabilir. –

+1

Şuna bakın: https://www.python.org/dev/peps/pep-0435/ – shuttle87

6

Muhtemelen miras yapısını kullanabilirsiniz.

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 
İlgili konular