not - python enumerate
python enums con atributos (2)
Python 3.4 tiene un nuevo tipo de datos Enum (que ha sido backported como enum34
y mejorado como aenum
1 ). Tanto enum34
como aenum
2 soportan fácilmente su caso de uso:
[ aenum
/ 3]
import aenum
class EnumWithAttrs(aenum.AutoNumberEnum):
_init_ = ''a b''
GREEN = ''a'', ''b''
BLUE = ''c'', ''d''
[ enum34
/ 3 o stdlib enum
3.4+]
import enum
class EnumWithAttrs(enum.Enum):
def __new__(cls, *args, **kwds):
value = len(cls.__members__) + 1
obj = object.__new__(cls)
obj._value_ = value
return obj
def __init__(self, a, b):
self.a = a
self.b = b
GREEN = ''a'', ''b''
BLUE = ''c'', ''d''
Y en uso:
--> EnumWithAttrs.BLUE
<EnumWithAttrs.BLUE: 1>
--> EnumWithAttrs.BLUE.a
''c''
1 Divulgación: soy el autor de Python stdlib Enum
, el enum34
backport y la biblioteca de Enumeración avanzada ( aenum
) .
2 aenum
también admite NamedConstants
y NamedTuples
basadas en NamedTuples
.
Considerar:
class Item:
def __init__(self, a, b):
self.a = a
self.b = b
class Items:
GREEN = Item(''a'', ''b'')
BLUE = Item(''c'', ''d'')
¿Hay alguna manera de adaptar las ideas para enumeraciones simples a este caso? (ver esta pregunta ) Idealmente, como en Java, me gustaría meterlo todo en una sola clase.
Modelo de Java:
enum EnumWithAttrs {
GREEN("a", "b"),
BLUE("c", "d");
EnumWithAttrs(String a, String b) {
this.a = a;
this.b = b;
}
private String a;
private String b;
/* accessors and other java noise */
}
Use una táctica nombrada :
from collections import namedtuple
Item = namedtuple(''abitem'', [''a'', ''b''])
class Items:
GREEN = Item(''a'', ''b'')
BLUE = Item(''c'', ''d'')