Storing class attributes in definition order
There are cases where the definition order makes a difference. For example, let’s assume we are creating a class that represents a CSV (Comma-Separated Values) format. The CSV format expects fields to have a particular order. In some cases, this will be indicated by a header, but it’s still useful to have a consistent field order. Similar systems are used in ORM systems such as SQLAlchemy to store the column order for table definitions, and for the input field order within forms in Django.
The classic solution without metaclasses
An easy way to store the order of the fields is by giving the field instances a special __init__
method that increments for every definition, so the fields have an incrementing index property. This solution could be considered the classic solution, as it would also work in Python 2:
>>> import itertools
>>> class Field(object):
... counter = itertools.count()
.....