Imagina que tienes un bar y necesitas preparar diferentes bebidas para tus clientes. Los métodos de clase y los métodos estáticos en Python son como las herramientas que usas para hacer esas bebidas.
Un método de clase es como una coctelera, donde puedes mezclar diferentes ingredientes y obtener una bebida deliciosa. Pero la coctelera no funciona sola, necesitas agregarle algunos ingredientes para obtener la bebida deseada. De manera similar, un método de clase en Python necesita una instancia de clase (el «ingrediente» principal) para poder ser utilizado y obtener resultados específicos para esa instancia.
Por otro lado, un método estático es como un exprimidor de limones. No necesita una instancia de clase para funcionar, ya que puede hacer su trabajo por sí solo. Así como puedes exprimir un limón para obtener jugo sin importar la bebida que estás preparando, un método estático en Python puede ser utilizado en diferentes instancias de clase sin ser afectado por los valores específicos de cada una.
Los métodos de clase y los métodos estáticos en Python
¿Que son los métodos de clase y como utilizarlos?
En Python, los métodos de clase son métodos que se definen en una clase y operan en los atributos y métodos de la propia clase, en lugar de en una instancia de la clase.
Para definir un método de clase en Python, se utiliza el decorador @classmethod
antes de la declaración del método. Además, el primer parámetro del método debe ser la clase misma, por convención se le llama cls
,
class MiClase:
variable_clase = "¡Soy una variable de clase!"
@classmethod
def metodo_de_clase(cls):
print("Este es un método de clase, y la variable_clase es:", cls.variable_clase)
Luego, para utilizar un método de clase, se puede llamar directamente desde la clase, sin necesidad de crear una instancia de la clase,
MiClase.metodo_de_clase()
En este ejemplo, al llamar al método de clase metodo_de_clase()
en la clase MiClase
, se imprimirá en pantalla el mensaje Este es un método de clase, y la variable_clase es: ¡Soy una variable de clase!
.
Los métodos de clase son útiles para operaciones que deben realizarse en la clase en sí misma, en lugar de en una instancia de la clase. Por ejemplo, se pueden utilizar para crear instancias de la clase de manera especial, inicializar variables de clase o para operaciones que necesitan conocer información específica de la clase.
¿Que diferencia hay entre un método de clase y un método normal?¿Cuando utilizar cada uno de ellos?
La principal diferencia entre un método normal y un método de clase en Python es que el primer parámetro de un método de clase es la clase misma (por convención se le llama cls
), mientras que el primer parámetro de un método normal es la instancia de la clase (por convención se le llama self
).
Entonces, ¿cuándo debemos utilizar un método normal y cuándo un método de clase? En general, se utilizan los métodos normales para operaciones que deben realizarse en una instancia de la clase, mientras que los métodos de clase se utilizan para operaciones que deben realizarse en la clase en sí misma.
Por ejemplo, si tenemos una clase Persona
con un atributo nombre y un método saludar
que imprime un mensaje personalizado de saludo, podemos definir el método de la siguiente manera,
class Persona:
def __init__(self, nombre):
self.nombre = nombre
def saludar(self):
print("Hola, mi nombre es", self.nombre)
Luego, para utilizar el método saludar()
en una instancia de la clase Persona
, creamos la instancia primero y luego llamamos al método en esa instancia,
persona = Persona("Juan")
persona.saludar()
En este ejemplo, el método saludar()
se define como un método normal que opera en la instancia de la clase Persona, y se utiliza llamando al método en una instancia de la clase.
Por otro lado, si queremos realizar una operación en la clase en sí misma, por ejemplo, para definir una variable de clase o crear una instancia de la clase de manera especial, entonces se utiliza un método de clase. Por ejemplo,
class Persona:
total_personas = 0
def __init__(self, nombre):
self.nombre = nombre
Persona.total_personas += 1
@classmethod
def crear_persona_especial(cls):
return cls("Juanito el especial")
En este ejemplo, el método crear_persona_especial()
se define como un método de clase utilizando el decorador @classmethod
, y se utiliza para crear una instancia de la clase Persona
de manera especial. Al llamar a este método en la clase Persona
(y no en una instancia de la clase), se crea una instancia con un nombre especial predefinido y se incrementa el contador total_personas
en la clase. Así, los métodos de clase son útiles para operaciones que deben realizarse en la clase en sí misma, mientras que los métodos normales se utilizan para operaciones que deben realizarse en una instancia de la clase.
¿Que son los métodos estáticos y como utilizarlos?
Los métodos estáticos en Python son métodos que se definen en una clase, pero que no operan en los atributos de la clase ni en las instancias de la clase. Estos métodos se utilizan generalmente para operaciones que no dependen de los atributos de la clase o de una instancia específica de la clase.
Para definir un método estático en Python, se utiliza el decorador @staticmethod
antes de la declaración del método. A diferencia de los métodos de clase, los métodos estáticos no requieren un primer parámetro especial (como self
o cls
).
class MiClase:
variable_clase = "¡Soy una variable de clase!"
@staticmethod
def metodo_estatico():
print("Este es un método estático")
Luego, para utilizar un método estático, se puede llamar directamente desde la clase, sin necesidad de crear una instancia de la clase:
MiClase.metodo_estatico()
En este ejemplo, al llamar al método estático metodo_estatico()
en la clase MiClase
, se imprimirá en pantalla el mensaje Este es un método estático
.
Los métodos estáticos son útiles para operaciones que no dependen de los atributos de la clase ni de una instancia específica de la clase, y por lo tanto pueden ser utilizados de manera más general en el programa.
¿Cuando utilizar los métodos estáticos?
Los métodos estáticos son útiles cuando se quiere definir una funcionalidad que pertenece a una clase pero que no depende de ningún atributo de instancia o de clase. A continuación, se presentan algunas situaciones en las que se pueden utilizar los métodos estáticos:
- Cuando se quiere implementar una funcionalidad que no depende de ningún atributo de la clase ni de una instancia en particular de la clase. Por ejemplo, un método que realiza una operación matemática simple, como calcular el valor absoluto de un número.
- Cuando se quiere proporcionar una función auxiliar que se utiliza en varias partes del programa y que no está específicamente relacionada con ninguna instancia de la clase. En este caso, se puede definir el método estático en la clase para tener una mejor organización del código.
- Cuando se quiere crear un método de la clase que no requiere acceso a ningún atributo de instancia ni de clase, pero que se relaciona con la lógica de la clase. Por ejemplo, se puede utilizar un método estático para crear una función de ayuda que comprueba la validez de una cadena de entrada en relación con la clase.
Algunos ejemplos prácticos
Imaginemos que estamos construyendo una aplicación que simula una competencia de carreras de caballos. En esta aplicación, cada caballo tiene un nombre, un color y un número asignado. Para crear un nuevo caballo, necesitamos generar un número único que nunca se repita entre los caballos. Para esto, podemos utilizar un método de clase que genere automáticamente un número de identificación para cada nuevo caballo que se cree,
class Caballo:
contador_caballos = 0
def __init__(self, nombre, color):
self.nombre = nombre
self.color = color
self.numero = Caballo.generar_numero()
@classmethod
def generar_numero(cls):
cls.contador_caballos += 1
return cls.contador_caballos
En este ejemplo, el método generar_numero
es un método de clase, porque se define utilizando el decorador @classmethod
. Este método se utiliza para generar un número de identificación único para cada nuevo caballo que se crea, y para esto utiliza la variable contador_caballos
, que es un atributo de clase que se incrementa cada vez que se crea un nuevo caballo.
Imaginemos ahora que estamos construyendo una aplicación que simula un restaurante, y necesitamos una función que convierta los precios de los platos del menú de una moneda a otra. Para esto, podemos utilizar un método estático que no dependa de ningún atributo de instancia ni de clase, pero que se relacione con la lógica de la clase Restaurante
,
class Restaurante:
def __init__(self, nombre, menu):
self.nombre = nombre
self.menu = menu
@staticmethod
def convertir_precio(precio, moneda_origen, moneda_destino):
if moneda_origen == 'USD' and moneda_destino == 'EUR':
return precio * 0.85
elif moneda_origen == 'EUR' and moneda_destino == 'USD':
return precio * 1.18
else:
return precio
En este ejemplo, el método convertir_precio
es un método estático, porque se define utilizando el decorador @staticmethod
. Este método se utiliza para convertir los precios de los platos del menú de una moneda a otra, y para esto no necesita acceder a ningún atributo de instancia ni de clase. En lugar de eso, recibe como parámetros el precio del plato, la moneda de origen y la moneda de destino, y devuelve el precio convertido.
¿Cuando utilizar una función y cuando un método estático?
Se recomienda utilizar una función independiente cuando la funcionalidad no está relacionada con ninguna clase en particular, o cuando la funcionalidad está relacionada con varias clases diferentes. En este caso, la función se puede utilizar en cualquier lugar donde sea necesario, sin tener que depender de ninguna instancia de clase específica.
Por otro lado, se recomienda utilizar un método estático cuando la funcionalidad está relacionada con la lógica de una clase en particular, pero no depende de ningún atributo de instancia específico. En este caso, el método estático se puede utilizar en cualquier instancia de la clase sin tener que crear una instancia adicional.
El vídeo
Lo mismo que te he contado en este artículo, pero en formato vídeo,