subclassing str

Duncan Booth 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.
Try this:

>>> class SpecialString(str):
	def __new__(cls, s):
		if isinstance(s, SpecialString):
			s = s._raw()
		return str.__new__(cls, s)
	def __str__(self):
		return "(" + self._raw() +")"
	def _raw(self):
		return str.__str__(self)

>>> 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 mailing list