On Mon, 21 Jun 2010 15:43:01 -0700, Stephen Hansen wrote:
> many types are fundamentally immutable(i.e., ints, strings), and its
> awful hard to make an immutable class.
It's really simple if you can inherit from an existing immutable class.
class K(tuple):
pass
Of course, that lets you add attributes to K instances, which might not
be what you want. So, in full knowledge that many Python programmers will
laugh and point at you, you can (ab)use __slots__ to remove that ability:
>>> class K(tuple):
... __slots__ = []
...
>>> t = K((1,2,3))
>>> t[0] = 0
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: 'K' object does not support item assignment
>>> t.x = 1
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
AttributeError: 'K' object has no attribute 'x'
The tricky part is making an immutable class from scratch, i.e.
inheriting from object. For a fairly large, complex example, you can see
how the Decimal class does it -- basically uses read-only properties for
public attributes, and hope that nobody modifies the private attributes.
(If they do, they deserve whatever pain they get.)
Or you can do something like this:
http://northernplanets.blogspot.com/2007/01/immutable-instances-in-python.html
There's probably no way to make pure Python classes completely immutable
without inheriting from an already immutable class. Pity.
--
Steven
--
http://mail.python.org/mailman/listinfo/python-list