2013-05-13 29 views
5

Jak opisano PEP435 An enum może być zdefiniowana w następujący sposób:Jak uzyskać atrybuty w kolejności, w jakiej są zadeklarowane w klasie Python?

class Color(Enum): 
    red = 1 
    green = 2 
    blue = 3 

i wynikających z enum members z Color można powtórzyć w celu definicję: Color.red, Color.green, Color.blue.

Przypomina mi Form w Django, w którym pola mogą być wykonane w kolejności są zadeklarowane w Form podklasy. Wdrożyli to, utrzymując licznik pól, za każdym razem, gdy tworzone jest nowe pole, wartość licznika jest zwiększana.

Ale w definicji Color, nie mamy czegoś takiego jak FormField, w jaki sposób możemy to wdrożyć?

Odpowiedz

10

W języku Python 3 można dostosować obszar nazw zadeklarowany przez klasę za pomocą metaklasu. Na przykład, można użyć OrderedDict:

from collections import OrderedDict 

class EnumMeta(type): 

    def __new__(mcls, cls, bases, d): 
     print(d) 
     return type.__new__(mcls, cls, bases, d) 

    @classmethod 
    def __prepare__(mcls, cls, bases): 
     return OrderedDict() 


class Color(metaclass=EnumMeta): 
    red = 1 
    green = 2 
    blue = 3 

Drukuje

OrderedDict([('__module__', '__main__'), ('red', 1), ('green', 2), ('blue', 3)]) 
+0

Zastanawiam się, czy można to zrobić w Python2.x, tak abyśmy stworzyli protokół 'enum'. – satoru

+0

Och, nie widziałem twojej odpowiedzi, dokładnie! –

+0

Nie. Jesteś sprowadzony do tego typu "FormField". –

4

w Pythonie 2.x można użyć this horrible hack pisałem odpowiedzieć nieco inne pytanie, jako fundament dla funkcjonalności tej sortować. Naprawdę, nie możesz. :-)

Powiązane problemy