6

Here is the code:

class Dummy(object):
    def __init__(self, v):
        self.ticker = v


def main():
        def _assign_custom_str(x):
            def _show_ticker(t):                
                return t.ticker
            x.__str__ = _show_ticker
            x.__repr__ = _show_ticker
            return x


    a = [Dummy(1), Dummy(2)]

    a1 = [_assign_custom_str(t) for t in a]
    print a1[1]
    # print a1[1].__str__ # test to if orig __str__ is replaced

I was hoping to see the output like this

2

However, instead I see the standard representation:

<__main__.Dummy object at 0x01237730>

Why?

1

2 Answers 2

17

Magic methods are only guaranteed to work if they're defined on the type rather than on the object.

For example:

def _assign_custom_str(x):
        def _show_ticker(self):                
            return self.ticker
        x.__class__.__str__ = _show_ticker
        x.__class__.__repr__ = _show_ticker
        return x

But note that will affect all Dummy objects, not just the one you're using to access the class.

Sign up to request clarification or add additional context in comments.

2 Comments

@dshanahan Thanks, fixed in the answer. In the future please suggest an edit rather than leaving a comment.
1

if you want to custmize __str__ for every instance, you can call another method _str in __str__, and custmize _str:

class Dummy(object):
    def __init__(self, v):
        self.ticker = v

    def __str__(self):
        return self._str()

    def _str(self):
        return super(Dummy, self).__str__()

def main():
    a1 = Dummy(1)
    a2 = Dummy(2)

    a1._str = lambda self=a1:"a1: %d" % self.ticker
    a2._str = lambda self=a2:"a2: %d" % self.ticker

    print a1
    print a2    

    a1.ticker = 100
    print a1

main()

the output is :

a1: 1
a2: 2
a1: 100

Comments

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.