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 verde
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.
Espero 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 🙂
Entrada anterior! | Siguiente entrada! |
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
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
Está muy esquematizado.
Llevo días peleándome con estos conceptos y aquí están resumidos de una forma clara y sencilla
¡Enhorabuena!
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!
gracias, usted lo explica muy claro
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