In the current version of Python, the class ordering is preserved. See PEP520 for details.
In older versions of the language (3.5 and below, but not 2.x), you can provide a metaclass which uses an OrderedDict
for the class namespace.
import collections
class OrderedClassMembers(type):
@classmethod
def __prepare__(self, name, bases):
return collections.OrderedDict()
def __new__(self, name, bases, classdict):
classdict['__ordered__'] = [key for key in classdict.keys()
if key not in ('__module__', '__qualname__')]
return type.__new__(self, name, bases, classdict)
class Something(metaclass=OrderedClassMembers):
A_CONSTANT = 1
def first(self):
...
def second(self):
...
print(Something.__ordered__)
# ['A_CONSTANT', 'first', 'second']
This approach doesn’t help you with existing classes, however, where you’ll need to use introspection.