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