source: trunk/essentials/dev-lang/python/Demo/newmetaclasses/Enum.py@ 3364

Last change on this file since 3364 was 3225, checked in by bird, 19 years ago

Python 2.5

File size: 4.3 KB
Line 
1"""Enumeration metaclass."""
2
3class EnumMetaclass(type):
4 """Metaclass for enumeration.
5
6 To define your own enumeration, do something like
7
8 class Color(Enum):
9 red = 1
10 green = 2
11 blue = 3
12
13 Now, Color.red, Color.green and Color.blue behave totally
14 different: they are enumerated values, not integers.
15
16 Enumerations cannot be instantiated; however they can be
17 subclassed.
18 """
19
20 def __init__(cls, name, bases, dict):
21 super(EnumMetaclass, cls).__init__(name, bases, dict)
22 cls._members = []
23 for attr in dict.keys():
24 if not (attr.startswith('__') and attr.endswith('__')):
25 enumval = EnumInstance(name, attr, dict[attr])
26 setattr(cls, attr, enumval)
27 cls._members.append(attr)
28
29 def __getattr__(cls, name):
30 if name == "__members__":
31 return cls._members
32 raise AttributeError, name
33
34 def __repr__(cls):
35 s1 = s2 = ""
36 enumbases = [base.__name__ for base in cls.__bases__
37 if isinstance(base, EnumMetaclass) and not base is Enum]
38 if enumbases:
39 s1 = "(%s)" % ", ".join(enumbases)
40 enumvalues = ["%s: %d" % (val, getattr(cls, val))
41 for val in cls._members]
42 if enumvalues:
43 s2 = ": {%s}" % ", ".join(enumvalues)
44 return "%s%s%s" % (cls.__name__, s1, s2)
45
46class FullEnumMetaclass(EnumMetaclass):
47 """Metaclass for full enumerations.
48
49 A full enumeration displays all the values defined in base classes.
50 """
51
52 def __init__(cls, name, bases, dict):
53 super(FullEnumMetaclass, cls).__init__(name, bases, dict)