Documentos de Académico
Documentos de Profesional
Documentos de Cultura
Comportamiento de Métodos
Comportamiento de Métodos
class Clase:
def __init__(cualquiercosa, nombre):
cualquiercosa.nombre = nombre
def hola(cualquiercosa):
print('¡Hola, %s!' % cualquiercosa.nombre)
Efectivamente, todos los métodos de una clase necesitan tener la referencia a la
instancia. Como puedes apreciar ni siquiera estoy usando self.
>>> c1 = Clase('Diego')
>>> c1.hola()
¡Hola, Diego!
Esto es equivalente, aunque un poco tonto, pero demuestra la forma en que un
método es llamada usando una instancia de la clase:
>>> c1 = Clase('Diego')
>>> Clase.hola(c1)
¡Hola, Diego!
No es posible llamar el método sin una instancia de por medio a menos que
uses @classmethod como veremos en el Caso 2:
>>> Clase.hola()
Traceback (most recent call last):
File "clases.py", line 11, in <module>
Clase.hola()
TypeError: unbound method hola() must be called with Clase instance as first argument (got nothing instead)
class Clase:
@classmethod
def hola(cualquiertonteria, nombre):
print('¡Hola, %s!' % nombre)
>>> Clase.hola('Diego')
¡Hola, Diego!
Esta clase ni siquiera tiene constructor, es una clase sin sentido que solo te saluda
pero la puedes llamar sin necesidad de tener una instancia de la clase. Podrías hacer
algo como esto:
class Clase:
def __init__(cualquiercosa, nombre, rango='Cadete'):
cualquiercosa.nombre = nombre
cualquiercosa.rango = rango
def hola(cualquiercosa):
print('¡Hola, %s! Eres un %s' % (cualquiercosa.nombre, cualquiercosa.rango))
@classmethod
def desde_nombre(cualquiertonteria, nombre):
return cualquiertonteria(nombre)
El método desde_nombre lo que hace realmente es retornar una instancia de la clase.
En este caso no hay mucha ciencia pero es muy útil en casos complejos en los que
los datos recibidos no concuerdan con los parámetros del constructor.
>>> c1 = Clase.desde_nombre('Diego')
>>> c1.hola()
¡Hola, Diego! Eres un Cadete
Personalmente lo he usado pocas veces pero se me vienen casos en los que este
método podría estar estrechamente relacionada a los datos que manejas en la clase y
quieres mantener todo en el mismo sitio. Es decir, en vez de crear una función
"helper" en otro módulo, pues lo creas en la misma clase como algún tipo de
validación:
class Clase:
def __init__(cualquiercosa, nombre):
cualquiercosa.nombre = nombre
def hola(cualquiercosa):
print('¡Hola, %s!' % cualquiercosa.nombre)
@staticmethod
def mis_padres_estan_locos(nombre):
estan_locos = False
if nombre in ('Hitler', 'Kakaroto'):
estan_locos = True
return estan_locos
>>> Clase.mis_padres_estan_locos('Hitler')
True
>>> Clase.mis_padres_estan_locos('Diego')
False
>>> Clase.mis_padres_estan_locos('Kakaroto')
True
Esto es, en resumen, más o menos como funcionan las clases en Python.