[Python-Dev] __str__ does not default to __repr__ if a base class has __str__

Guido van Rossum guido at python.org
Mon May 17 23:48:25 EDT 2004

> # In the code below, "a.__str__()" does not default to "a.__repr__() as
> # might be expected. It finds the "__str__" in the base class X. The
> # Reference Manual, section 3.3.1, says:
> #    If a class defines __repr__() but not __str__(), then __repr__() is
> #    also used when an 'informal' string representation of instances of
> #    that class is required.
> # If the reader is in lawyer mode, the documentation is correct.
> # Is the current behavior what was intended? What should the behavior be?
> class X(object):
>     def __str__(self):
>         return 'str for X'
>     def __repr__(self):
>         return 'repr for X'
> class A(X):
>     def __repr__(self):
>         return 'repr for A'
> #    __str__ = __repr__
> x = X()
> a = A()
> print x.__str__()
> print x.__repr__()
> print a.__str__()
> print a.__repr__()

This has never been different and the current outcome is exactly what
was intended.  The only case where __repr__ and __str__ act as each
other's default is when there's no base class.

And in any case, you're not supposed to call __str__ or __repr__
directly -- you should call str(x) or repr(x), etc. -- not that it
makes a difference here.

--Guido van Rossum (home page: http://www.python.org/~guido/)

More information about the Python-Dev mailing list