Métodos y atributos de clase
Hasta ahora, los métodos y atributos de los que hemos hablado están asociados a un objeto. En este capítulo hablaremos sobre métodos y atributos que están asociados a la clase directamente.
En general, los métodos y atributos de instancia se utilizan mucho más que los métodos y atributos de clase. Sin embargo, es importante que conozcas para qué sirven y cómo se definen los métodos y atributos de clase.
Métodos de clase
Un método de clase es muy parecido a un método de instancia, con la diferencia de que el nombre tiene el prefijo self.
:
Para invocar este método debes hacerlo directamente sobre la clase (fíjate que el prefijo self.
se omite):
Si intentas invocar el método sobre una instancia recibirás un error:
¿Para qué sirven los métodos de clase?
Los métodos de clase sirven para ese código que está relacionado con la clase pero que no depende de ninguna instancia particular. El uso depende de las necesidades de cada programa y la imaginación de cada persona, pero en mi experiencia he encontrado que los métodos de clase se utilizan generalmente para:
Crear objetos complejos.
Como métodos de ayuda que se pueden utilizar desde diferentes partes, pero no están asociados a ningún objeto.
Veamos algunos ejemplos. Empecemos agregando algunos métodos a nuestra clase Person
para ayudarnos en la creación de objetos:
Para este ejemplo hemos creados dos métodos de clase create_female
y create_male
que podemos utilizar de la siguiente forma:
Este es un ejemplo trivial y quizá no sea una buena idea crear métodos de clase para ahorrarse pasar un argumento más al crear una persona, pero imagina que la creación de un hombre o de una mujer implique muchos otros atributos y fuera más complejo. En ese caso tendría mucho sentido.
Veamos otro ejemplo. Supongamos que necesitamos enviar correos desde diferentes partes de nuestra aplicación. Podríamos crear una clase Mailer
que exponga algunos métodos de clase para enviar correos con algunas variaciones:
Ahora podemos utilizar estos métodos desde donde queramos sin necesidad de crear una instancia de Mailer
:
La última línea de este código debería enviar un correo a "pedro@example.com" desde una dirección de correo que configuraríamos por defecto. Pero ¿dónde podemos almacenar dicha dirección? De eso vamos a hablar en la siguiente sección.
Atributos de clase
Supongamos que necesitamos contar cuántos objetos se crean a partir de la clase Person
. Esa información la podríamos almacenar en un atributo de clase. Los atributos de clase se identifican porque utilizan dos @@
en vez de una:
En este ejemplo estamos inicializando nuestro atributo de clase @@people_count
en 0. Cada vez que se cree un objeto de tipo Person
se va a invocar el constructor initialize
que incrementa @@people_count
en 1.
Los atributos de clase no son visibles fuera de la clase. Es por eso que creamos un método de clase people_count
que va a retornar @@people_count
.
Probemos esta clase a ver si funciona:
Volvamos a nuestro ejemplo de la clase Mailer
. Podemos utilizar un atributo de clase para almacenar la dirección de correo por defecto que se va a utilizar desde el método de clase send_with_default_sender
:
Agregamos un atributo de clase @@default_sender
que contiene un valor por defecto. Sin embargo, también creamos un método de clase default_sender=
que va a permitir cambiar el valor por defecto:
Muy bien. Ahora ya sabes que existen los métodos y los atributos de clase, también sabes cómo utilizarlos.
Ejercicios
Last updated