As described in PEP435, an enum
can be defined this way:
class Color(Enum):
red = 1
green = 2
blue = 3
And the resulting enum members
of Color
can be iterated in definition order: Color.red, Color.green, Color.blue
.
This reminds me of Form
in Django
, in which fields can be rendered in the order they are declared in a Form
subclass. They implemented this by maintaining a field counter, every time a new field is instantiated the counter value get incremented.
But in the definition of Color
, we don't have something like a FormField
, how can we implement this?
It doesn't matter in which order variables and functions are defined in Class in Python.
Use the dir() function to get all attributes of an object, e.g. print(dir(object)) . The dir function will return a list of the valid attributes of the provided object. Copied! The dir function takes an object and returns a list containing the object's attributes.
Python getattr() function is used to get the value of an object's attribute and if no attribute of that object is found, default value is returned.
In Python 3, you can customize the namespace that a class is declared in with the metaclass. For example, you can use an 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
This prints
OrderedDict([('__module__', '__main__'), ('red', 1), ('green', 2), ('blue', 3)])
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With