duncan.booth at invalid.invalid
Tue Sep 14 15:49:08 CEST 2004
Thomas Lotze wrote:
> Using instances
> x = SpecialString('foo')
> y = SpecialString(x)
> I want to get this behaviour:
> str(x) => '(foo)'
> str(y) => '(foo)'
> That is, I want to be able to make a SpecialString from anything that
> has a string representation, but at the same time leave a
> SpecialString untouched in the process. After all, it already is and
> gets formatted as a SpecialString.
>>> class SpecialString(str):
def __new__(cls, s):
if isinstance(s, SpecialString):
s = s._raw()
return str.__new__(cls, s)
return "(" + self._raw() +")"
>>> x = SpecialString('foo')
>>> y = SpecialString(x)
>>> print x
>>> print y
You have to override __new__ as the default constructor for str calls the
__str__ method on its argument (which is where your extra parens appear).
Having added a method to bypass the formatting it makes sense to use it
inside __str__ as well otherwise the code is very sensitive to minor edits
e.g. changing it to:
return "(%s)" % self
would cause an infinite loop.
More information about the Python-list