Problem with __str__ if baseclass is list

Serge Orlov Serge.Orlov at gmail.com
Sun Nov 13 03:17:00 EST 2005


Edward C. Jones wrote:
> #! /usr/bin/env python
>
> class A(list):
>      def __init__(self, alist, n):
>          list.__init__(self, alist)
>          self.n = n
>
>      def __str__(self):
>          return 'AS(%s, %i)' % (list.__str__(self), self.n)
>
>      def __repr__(self):
>          return 'AR(%s, %i)' % (list.__repr__(self), self.n)
>
> a = A(['x', 'y'], 7)
>
> print 1, a
> print 2, repr(a)
> print 3, list.__str__(a)
> print 4, list.__repr__(a)
>
> """
> The output is:
>
> 1 AS(AR(['x', 'y'], 7), 7)
> 2 AR(['x', 'y'], 7)
> 3 AR(['x', 'y'], 7)
> 4 ['x', 'y']
>
> Why is list.__str__(a) == "AR(['x', 'y'], 7)"?

Because it's coded like this:
def __str__(self):
    return repr(self)

That implies str(x) == repr(x), since you don't want that, don't call
list.__str__

>
> Note: The problem goes away if "list.__str__(a)" is replaced with
> "list.__repr__(self)".
> """

That's right. You *cannot* call list.__str__ because it contradicts
design of class A




More information about the Python-list mailing list