Variables de Clases: Estáticas o de Instancia – Python OOP

Continuando con las lecciones de Python orientado a objetos es el momento de ver variables de clases e instancia y métodos de clase e instancia.

Como habíamos visto anteriormente los atributos y métodos definen las características del objeto y modifican su estado. Son datos que están asociados a ellas. De ellos se desprenden dos tipos de variables, de clase o de instancia (objeto).

Antes de aprender esto me gustaría repasar lo siguiente:

  • Las clases agrupan objetos con propiedades y características en común, por ejemplo (Perros)
  • Instancia significa crear un objeto a partir de una clase.
  • Los atributos y métodos son elementos que almacenan datos (diferenciando los objetos dentro de la misma clase) utilizando variables de instancia.

Las variables de clase corresponden a una clase determinada y son accesibles sólo invocando la clase.(Ver mas abajo)

Las variables de instancia también a una clase determinada pero sólo es accesible mediante la instancia del objeto.(Ver mas abajo)

Y lo mismo sucede con los métodos!

Veamos con mas profundidad y ejemplifiquemos esto.

Variables de clase

Las variables de clases o estáticas como dijimos mas arriba son definidas dentro de una clase, mas específicamente luego del encabezado. Pero nunca dentro de un método, porque eso la convertiría en una variable de instancia.

Sintaxis de variables estáticas de clase

Veamos ahora cómo crear una variable de clase. Primeramente debemos crear una clase por supuesto!.

#!/usr/bin/env python
# -*- coding: utf-8 -*-
# pythones.net

class Perros (object):
    'Clase para los perros' #Descripción
    Collar = True #Variable de clase Estática
    def __init__(self, salud, hambre):
        self.salud = salud #Variable de Instancia
        self.hambre = hambre #Variable de Instancia

Puedes ver donde declaramos la variable de clase? Justo después del encabezado de la clase y luego de la Descripción de clase. Si esto no lo sabías ahora lo sabes, es para organizarnos mejor. La creamos utilizando comillas simples!

En este caso la variable del tipo Booleano «collar» es igual a True. Determina que todos nuestros perros tienen collares.

Acceso

Ahora esta variable al ser de tipo clase, nos permite acceder a ella sin necesidad de instanciar (es decir, de crear un objeto perteneciente a esta clase). Por ende para acceder a ella basta con colocar la clase y el nombre de la variable:

print (Perros.Collar)

Resultado:

True

Variables de instancia

Las variables de instancia son aquellas que se relacionan con una única instancia de una clase.

En el código anterior las variables de instancia son salud y hambre. Porque dependen exclusivamente de la instancia de clase. Es decir que para acceder a ellas debemos si o si instanciar: Crear un objeto de la clase Perros.

Sintaxis de variables de instancia

#!/usr/bin/env python
# -*- coding: utf-8 -*-
# pythones.net

class Perros (object):
    'Clase para los perros' #Descripcion
    Collar = True #Variable de clase Estática
    def __init__(self, salud, hambre):
        self.salud = salud #Variable de Instancia
        self.hambre = hambre #Variable de Instancia


# print (Perros.hambre) #-> No puedes acceder de esta manera porque hambre es una variable de instancia
#Debes instanciar:
Dogo = Perros(100, 50)
print(Dogo.hambre)

Resultado:

50

Lo mismo sucede con los métodos. Están los métodos de clase, estáticos y de instancia:

Métodos de clase

Los métodos de clases son similares a las variables de clase y nos permite acceder a ellos sin instanciar un objeto. Pero para indicarle a python que un método es de clase debemos usar un decorador que nos permite modificar las funciones utilizando otra función para ampliar su funcionalidad. Estos decoradores los veremos en profundidad en la próxima lección, ahora nos enfocaremos en diferenciar los métodos.

Sintaxis de los métodos de clase

Para indicarle a python que se trata de un método de clase debemos utilizar el decorador @classmethod

#!/usr/bin/env python
# -*- coding: utf-8 -*-
# pythones.net

class Animal (object):
    @classmethod
    def correr(self, km):
        print ("El animal corre %s kilómetros" % km)                #Aquí estamos utilizando format
    'Clase para los animales corredores' #Descripción de esta clase


Animal.correr(12)

Resultado:

El animal corre 12 kilómetros

Como ves en el ejemplo no necesitamos instanciar ningún objeto para acceder a este método de la clase Animal. Solo llamamos el método mediante la clase, y brindamos los argumentos en este caso los km que corrio el animal 😛

 

Sintaxis de los métodos de instancia

Los métodos de instancia son aquellos que utilizamos normalmente a los que no necesitamos añadir ningún decorador y que dependen estrictamente de que instanciemos para poder llamarlos. Observa:

#!/usr/bin/env python
# -*- coding: utf-8 -*-
# pythones.net

class Ave (object):
    'Clase para las aves' #Descripcion
    def __init__(self):
        pass
    
    def hablar (self, color):
        print ("Soy una jodida ave de color %s" %color) #Usamos format


#Ave.hablar ('verde') #-> No puedes acceder de esta manera porque es un método de instancia

#Debes instanciar (crear un objeto a partir de la clase)
Loro = Ave()
Loro.hablar('verde') #Ahora si invocamos al método de instancia

Resultado:

Soy una jodida ave de color verdeclase ave

 

Sintaxis de los métodos estáticos

Los métodos estáticos requieren del decorador @staticmethod para indicarle a python que se trata del mismo. Este tipo de método nos permite llamar una función elegantemente dentro de una clase sin que este ligada a la clase misma ni a la instancia. Veamos un ejemplo con el mismo código anterior.

#!/usr/bin/env python
# -*- coding: utf-8 -*-
# pythones.net

class Ave (object):
    'Clase para las aves' #Descripción
    def __init__(self):
        pass
    
    def hablar (self, color):
        print ("Soy una jodida ave de color %s" %color) #Usamos format
        
    @staticmethod        ### ######decorador staticmethod
    def funcion_volar_ave(tiene_alas, kms): #Definimos el metodo
        #####Condicional####################
        if tiene_alas == True:
            print ("El ave se fue volando %i kilometro" %kms)
        else:
            print ("Este ave no puede volar")


Ave.funcion_volar_ave(True, 1) #Llamamos el método (función) usando la clase

Resultado:

El ave se fue volando 1 kilometro

Si le pasamos el argumento False en vez de True imprimirá que no puede volar.

Comprender las variables y métodos de clase nos sera beneficioso cuando comencemos a crear nuestros primeros programas o aplicaciones orientados a objetos.

Descansando en la nube: login offEspero te halla servido para comprender mejor las clases en python. No es difícil, pero lo que si es difícil es encontrarlo todo ordenado y ejemplificado de manera sencilla. No olvides compartir, recomendarle a algún amigo interesado en python o suscribirte a mi blog! Muchas gracias por leerme 🙂

 


 

Sigue leyendo!
Entrada anterior! Siguiente entrada!

Compartir es agradecer! :)

7 comentarios en “Variables de Clases: Estáticas o de Instancia – Python OOP”

  1. gracias amigo, como lo mencionaste «es difícil es encontrarlo todo ordenado y ejemplificado de manera sencilla», le entendí bastante bien, me ayudo a aclarar mis dudas, aunque no entendí bien el porque declaras la def _init_ y que es el parametro (self) de ahí en fuera todo lo demás muy bien entendido, grcias

    1. Hola alberto eso está explicado en el blog, el __init__ es el método constructor y el self es una palabra que hace referencia a «si mismo». También está explicado en el blog en otra entrada, creo que en la principal de clases, buscalo. Un saludo gracias por leer

  2. Hola Mariano, todo muy bien organizado, de forma clara y con ejemplos útiles.

    Lo que no me acaba de quedar claro es la utilidad de usar métodos de clase y estáticos, así como su diferencia. ¿Usar un método estático no es lo mismo que usar una función fuera de la clase?

    Saludos!

  3. Hola!! primero que nada me gustaría agradecer al autor por hacer este blog donde explica todo con tanto detalle, sin embargo en esta entrada se ha usado una forma de format que no llego a comprender del todo

    print («Soy una jodida ave de color %s» %color) #Usamos format
    en la entrada de la funcion format no se explica este modo y la verdad es que no soy capaz de comprender que se ha hecho

  4. Debo felicitarte y agradecerte por este blog, encontrarlo fue como hallar agua en el desierto, como al mismo tiempo fue buscando cobre, encontrar oro, plata, bronces, diamantes, esmeraldas y hasta petroleo.

Deja un comentario

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *

Este sitio usa Akismet para reducir el spam. Aprende cómo se procesan los datos de tus comentarios.