¿Por qué no puedo reemplazar el método __str__ de un objeto Python con otra función?

Aquí está el código:

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 

Tenía la esperanza de ver la salida como esta

 2 

Sin embargo, en cambio veo la representación estándar:

  

¿Por qué?

Solo se garantiza que los métodos mágicos funcionarán si se definen en el tipo en lugar del objeto .

Por ejemplo:

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

Pero tenga en cuenta que afectará a todos los objetos Dummy , no solo al que está usando para acceder a la clase.

Si desea conservar __str__ para cada instancia, puede llamar a otro método _str en __str__ , y 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() 

la salida es:

 a1: 1 a2: 2 a1: 100