Ver Mensaje Individual
  #7 (permalink)  
Antiguo 15/12/2011, 08:06
gepatino
 
Fecha de Ingreso: octubre-2011
Mensajes: 3
Antigüedad: 12 años, 6 meses
Puntos: 0
Respuesta: Parametro self en python dudas.

Creo que ya explicaron todo bastante bien, pero van un par de aportes:

Aunque al principio sea poco intuitivo tener que declarar explicitamente el objeto sobre el que vas a operar dentro del metodo, creo que el por que de esta eleccion era para simplificar el funcionamiento interno de python. No hay nada que el interprete tenga que deducir o adivinar, al llamar a un metodo de una instancia, en realidad llama a Clase.metodo(instancia, args).

Una funcionalidad extra que te permite este funcionamiento es agregar metodos a una instancia ya existente. Si bien no es una practica muy prolija puede ser de mucha utilidad en ciertos casos.

Por ejemplo:

Código Python:
Ver original
  1. class Persona(object):
  2.     def __init__(self, name):
  3.         self.name = name
  4.  
  5.     def __str__(self):
  6.         return self.name
  7.  
  8.  
  9. def saludo(obj, saludo='Hola'):
  10.     return saludo + ', ' + str(obj)

Ahi tenemos una clase, y una funcion que genera un saludo para un objeto que le pasas.

Podrías usarlo asi:
Código Python:
Ver original
  1. p = Persona('Jose')
  2. print saludo(p1)

Pero tambien podes hacer:
Código Python:
Ver original
  1. Persona.saludo = saludo
  2. p.saludo()

y tendrias el mismo resultado


Esto te permite remplazar ciertos metodos en casos especificos, por ejemplo:

Código Python:
Ver original
  1. >>> class Persona(object):
  2. ...     def __init__(self, name):
  3. ...             self.name = name
  4. ...     def save(self):
  5. ...             print 'saving to db'
  6. ...
  7. >>>
  8. >>> def save_to_file(obj):
  9. ...     print 'saving to file'
  10. ...
  11. >>>
  12. >>> p = Persona('Maria')
  13. >>> p.save()
  14. saving to db
  15. ...
  16. >>> Persona.aux = Persona.save
  17. >>> Persona.save = save_to_file
  18. >>> p.save()
  19. saving to file
  20. >>> Persona.save = Persona.aux
  21. >>> del(Persona.aux)
  22. >>> p.save()
  23. saving to db
  24. >>>


Bueno, espero que a alguien se le ocurra un buen uso para esto, y a no abusar ya que despues el codigo no lo mantiene ni cadorna.