Yet another solution I just thought of: The simplest way to get the same behaviour as your original code is
Immutable = collections.namedtuple("Immutable", ["a", "b"])
It does not solve the problem that attributes can be accessed via [0]
etc., but at least it’s considerably shorter and provides the additional advantage of being compatible with pickle
and copy
.
namedtuple
creates a type similar to what I described in this answer, i.e. derived from tuple
and using __slots__
. It is available in Python 2.6 or above.