Can __new__ prevent __init__ from being called?
Steven Bethard
steven.bethard at gmail.com
Wed Feb 16 14:30:15 EST 2005
Colin J. Williams wrote:
> This prompts a similar query. __new__ appears to be intended for
> immutable objects but it seems to be called as part of constructor
> process for all instances.
That's because Python has no builtin way of determining whether or not a
given type is immutable. If you wanted to, you could define both
__new__ and __init__, the first to set immutable parts and the second to
set mutable parts, e.g.:
py> class PartlyMutableTuple(tuple):
... def __new__(cls, *args, **kwargs):
... return super(PartlyMutableTuple, cls).__new__(cls, args)
... def __init__(self, *args, **kwargs):
... self.__dict__.update(kwargs)
...
py> t = PartlyMutableTuple(1, 2, 3, a=4, b=5)
py> t
(1, 2, 3)
py> t.a, t.b
(4, 5)
py> t.a, t.b = t.b, t.a
py> t.a, t.b
(5, 4)
py> t[0] = 2
Traceback (most recent call last):
File "<interactive input>", line 1, in ?
TypeError: object does not support item assignment
I don't think I'd advise this strategy, but by always calling both
__new__ and __init__, Python makes it possible...
Steve
More information about the Python-list
mailing list