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 originalclass Persona(object):
def __init__(self, name):
self.name = name
def __str__(self):
return self.name
def saludo(obj, saludo='Hola'):
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 originalp = Persona('Jose')
print saludo(p1)
Pero tambien podes hacer:
Código Python:
Ver originalPersona.saludo = saludo
p.saludo()
y tendrias el mismo resultado
Esto te permite remplazar ciertos metodos en casos especificos, por ejemplo:
Código Python:
Ver original>>> class Persona(object):
... def __init__(self, name):
... self.name = name
... def save(self):
... print 'saving to db'
...
>>>
>>> def save_to_file(obj):
... print 'saving to file'
...
>>>
>>> p = Persona('Maria')
>>> p.save()
saving to db
...
>>> Persona.aux = Persona.save
>>> Persona.save = save_to_file
>>> p.save()
saving to file
>>> Persona.save = Persona.aux
>>> del(Persona.aux)
>>> p.save()
saving to db
>>>
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.