Вопрос по python – Почему я не могу заменить метод __str__ объекта Python другой функцией?

5

Вот код:

<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
</code>

Я надеялся увидеть результат, как это

<code>2
</code>

Однако вместо этого я вижу стандартное представление:

<code><__main__.Dummy object at 0x01237730>
</code>

Зачем?

Обратите внимание, что этоdoes работа с классами старого стиля (не расширяетсяobject). Смотрите мой вопрос на разницу:stackoverflow.com/questions/16062293/… BoppreH

Ваш Ответ

2   ответа
13

определяется по типу, а не по объекту.

Например:

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

Но учтите, что это повлияет на всеDummy объекты, а не только тот, который вы используете для доступа к классу.

1

если хочешь кастомизировать__str__ для каждого экземпляра вы можете вызвать другой метод _str в__str__и настройте _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()

выход:

a1: 1
a2: 2
a1: 100

Похожие вопросы