为什么我不能用另一个函数替换Python对象的__str__方法?

Ant*_*ong 5 python

这是代码:

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
Run Code Online (Sandbox Code Playgroud)

我希望看到像这样的输出

2
Run Code Online (Sandbox Code Playgroud)

但是,相反,我看到了标准表示:

<__main__.Dummy object at 0x01237730>
Run Code Online (Sandbox Code Playgroud)

为什么?

agf*_*agf 14

只有在类型而不是对象上定义魔术方法时,才能保证魔术方法有效.

例如:

def _assign_custom_str(x):
        def _show_ticker(self):                
            return self.ticker
        x.__class__.__str__ = _show_ticker
        x.__class__.__repr__ = _show_ticker
        return x
Run Code Online (Sandbox Code Playgroud)

但请注意,这将影响所有Dummy对象,而不仅仅是您用于访问该类的对象.