En el post pasado habíamos tratado el tema de la creación de clases y el encapsulamiento de atributos, también llamados propiedades, donde limitamos o controlamos el acceso a los atributos. Una propiedad no es mas que un atributo al que mediante métodos controlamos su acceso de lectura y escritura.
Esta vez trataré el tema de variables de clase, métodos de clase y métodos estáticos y explicar la relación que tienen estos con los objetos que creamos.
Relación entre el entorno estático y el entorno dinámico.
En el post pasado expliqué que una clase es algo así como un molde del cual creamos varios objetos, sabemos que mientras el molde sea el mismo, los objetos serán casi idénticos, si cambiamos algo al molde, también los objetos se verán afectados, pero si cambiamos algo en el objeto, este cambio no pasará al molde, por tanto el molde o la clase es estática, pero el objeto podrá cambiar en el transcurso del programa.
En este sentido, hay variables de clase que hacen parte de la clase y pueden ser accedidos desde la misma clase, al igual que los métodos de clase. La clase en sí no puede acceder a los objetos a pesar de que deriva de ella y menos cuando de ella no se ha creado ningún objeto.
Sin embargo desde un objeto se puede acceder a las propiedades y métodos del mismo objeto, pero también puede un objeto acceder a las variables y métodos de la propia clase. Veremos como funciona a continuación.
Variables de clase.
El nombre clave aquí es variable, ya que no es un parámetro, ni atributo, ni propiedad, para crear una variable de clase simplemente la declaramos dentro de la clase, pero por fuera de
los métodos de la clase.
class Persona:
numero_personas = 0
def __init__(self, nombre, edad):
self.nombre = nombre
self.edad = edad
persona1 = Persona("Alex",40)
Ahora veamos como acceder a la variable numero_personas:
class Persona1:
...........
print(Persona.numero_personas) # Resultado es 0
persona1 = Persona("Alex",40)
print(persona1.numero_personas)# Resultado es 0
print(Persona.edad) # Esto arroja un error
Se puede apreciar que podemos usar el nombre de la clase seguido del nombre de la variable para acceder al valor. Lo mismo podemos hacer desde el objeto sin problemas, pero desde la clase no podemos acceder a algún atributo, ya que la clase desconoce si de ella derivan objetos o no.
Pero ¿qué podemos hacer con una variable de clase?, podemos crear un contador o un identificador para nuestros objetos.
class Persona:
numero_personas = 0
def __init__(self, nombre, edad):
Persona.numero_personas += 1
self.id = Persona.numero_personas
self.nombre = nombre
self.edad = edad
persona1 = Persona("Alex",40)
persona2 = Persona("Julian", 36)
print(persona1.id) # Imprime 1 el ID del objeto persona.
print(persona2.id) # Imprime 2
Método de clase.
Para hacer un método de clase, hay que agregar un decorador "@classmethod" y un parámetro que puede ser cualquiera, pero se recomienda que sea "cls".
class Persona:
numero_personas = 0
@classmethod
def _asignar_identificador(cls):
cls.numero_personas += 1
return cls.numero_personas
def __init__(self, nombre, edad):
self.id = _asignar_identificador()
self.nombre = nombre
self.edad = edad
Esta modificación a la clase, funciona exactamente igual a la anterior, solo que mejora un poco la asignación del atributo id, también es posible acceder desde la propia clase 'Persona.asignar_identificador()', pero como no quería que se "accediera" desde fuera, le antepuse un #underscore.
Método estático.
Para crear un método estático es muy similar al método de clase, para hacerlo, agregamos el decorador @staticmethod y no necesitamos ningún parámetro.
class Persona:
numero_personas = 0
@staticmethod
def metodo_estatico():
return Persona.numero_personas
@classmethod
def _asignar_identificador(cls):
cls.numero_personas += 1
return cls.numero_personas
La intención de crear una clase estática es poder ejecutar operaciones que nada tengan que ver con la clase o con los objetos de la clase, pero que igualmente están relacionados, como operaciones matemáticas, guardado de datos en una base de datos, acciones mas genéricas.
Por eso mismo el método estático no tiene una forma directa de acceder a variables de la clase, sino que todo se hace de forma indirecta porque está pensado para operaciones mas genéricas.
Fin.
No siendo mas eso es todo por el momento, quizás para un próximo post explique como usar algunos métodos especiales para las clases.
Nos vemos en un próximo blog.
Comments