
Clases en Python 3
Para aprender a crear clases en Python 3 primero tenemos que aprender ¿Qué es una clase?. Debemos aprender a pensar en términos de programación orientada a objetos que es algo diferente a la programación estructurada con la que se aprende a programar en Python.
¿Qué es una clase en Python?
Aquí es donde se suelen perder muchos novatos de la programación; donde tienen errores de conceptos y les cuesta entender al 100% de que se habla cuando se mencionan clases; objetos; instancias. Pero venga!. Tratare de explicarlo lo mas sencillo posible!
¿Clase?
Podemos definir una clase vagamente como una Plantilla o modelo para crear a partir de ella ciertos Objetos. Esta plantilla es la que contiene la información; características y capacidades que tendrá el objeto que sea creado a partir de ella.
Así a su vez los objetos creados a partir de ella estarán agrupados en esa misma clase.
Imagina que tienes una regla de esas con moldes para crear figuras geométricas perfectas. Pues algo así seria una clase; tu puedes crear esa regla y definir en ella las características de cada figura que seria un objeto.
Crear un objeto a partir de una clase se denomina instanciar.
🤔 ¿Qué es un Objeto en Python?
Es muy sencillo; cuando pensamos en objetos pensamos en entidades que tienen un comportamiento; un estado;almacenan información y pueden realizar tareas. Refiriéndonos a comportamiento como acciones o capacidades de realizar cambios; y a estados como situación o modo de estar en un momento determinado.
Pero hay algo que debes saber también de los objetos. No necesariamente todos deben derivar de una clase; pueden existir objetos sin que hallan sido creados de una clase en particular. Y en Python o Java casi todo es un objeto; puesto que el concepto de la programación orientada a objetos consiste en resolver problemas grandes subdividiendo nuestro programa en otros más pequeños a cargo de objetos con determinadas características y tareas encomendadas.
Es así entonces que podemos ver los objetos como si fueran engranajes de nuestro programa; si habláramos más en términos de relojería podría decirse que estos son objetos que contienen una información especifica (tamaños; apertura de dientes; etc.) y a su vez realizan una acción determinada que resulta importante para el funcionamiento de un sistema. Faltando uno que otro engranaje nuestro reloj dejaría de funcionar.
Pues así también debemos planificar nuestro programa; pensando en clases que crearán objetos y estos objetos trabajaran y almacenaran datos para cumplir la función o brindar la solución objetivo de nuestro programa.
⚙️ Atributos y métodos de un objeto.
Ya te dije!!. Los objetos almacenan información y realizan tareas!!. Entonces estos atributos pueden llamarse las características que nosotros definimos para ese objeto. Y métodos las tareas que son capaces de realizar!
Así comencemos a lavar tu cerebro para pensar orientado a objetos suponiendo:
- Tenemos laClase: Animal
- Elobjeto instanciado(creado a partir de esa clase):Perro
- Que tiene susatributos:
-
- Color: negro;
- Raza: Coquer;
- Tiene collar: True (si))
-
- Y tiene susmétodos:
-
- Ladra («Guau; guau»)
- Corre (Run)
- Camina()
- Olfatea()
-
Pero estos atributos y métodos se definen en la clase; al momento de crear la clase y luego al momento de instanciar (crear un objeto a partir de clase) se le brindan los «argumentos» para esos atributos y métodos.
Recuerda que los atributos son las características del objeto normalmente almacenadas en variables declaradas en la clase.
Y los métodos podrían verse como funciones del objeto que puede realizar y que a veces necesitan de ciertos argumentos para poder operar con sus parámetros.
Fíjate ahora en el siguiente ejemplo y habrá de quedarte mucho más claro. Por supuesto aquí solo estamos introduciendo el pensamiento; lo abstracto de los conceptos y demás. Para llevarse a cabo en Python o en cualquier otro lenguaje hay que respetar ciertasintaxisy demás normas que luego habrás de aprender.
➡️ Ejemplo gráfico de Clases en python; objeto e instancia
Fíjate en este ejemplo vamos a jugar a ser Dioses: Vamos a crear la clase Humano que tendrá ciertos atributos propios de cualquier ser Humano y algunos métodos también que pueden realizar los seres humanos. A partir de esta clase vamos a crear dos objetos: Marcos y Elisa. Que serán nuestros seres y al momento de la instancia les vamos a dar los valores para cada uno de sus atributos y métodos.
Diagrama
- La clase Humano posee Atributos(Fecha de nacimiento; edad; Padres; Genero..)
- La clase Humano posee Métodos (Correr; Caminar y Hablar)
- Los objetos Marcos y Elisa pertenecen a la misma Clase; pero tienen Diferentes valores para los atributos y sus métodos quizás obtengan diferentes argumentos (valores para sus parámetros).
✅ Repaso sobre clases y objetos
Entonces vamos a realizar un repaso; puesto que estos conceptos y su entendimiento en profundidad son esenciales para programar orientado a objetos de manera lógicamente correcta.
- Clase: Plantilla o modelo a partir de la cual podemos crear objetos y donde se determinan los atributos (características) y métodos (acciones realizables) que tendrán.
-
- Objeto: Normalmente creado a partir de una clase son entidades que almacenan información en forma de argumento para atributos y realizan acciones organizadas a través de métodos que permiten cambiar atributos o estados del objeto o de otros objetos de la clase.
- Los atributos: Son variables de diferentes tipos (Entero; Texto; Booleanos) que pueden tener valores por defecto o le podrán ser asignadas al momento de la Instancia de un objeto determinando sus características y estado.
- Los métodos: Son funciones; acciones realizables por el objeto que permiten cambiar sus atributos o el de otros objetos de la clase permitiendo un cambio de estado del objeto; a menudo requiriendo «argumentos(valores)» para determinados «parámetros(nombres de variables establecidas en funciones o rutinas).
- Instancia: Palabra que refiere a la creación de un objeto partiendo de una clase. Durante la instancia son asignados los valores iniciales para los atributos.
- Objeto: Normalmente creado a partir de una clase son entidades que almacenan información en forma de argumento para atributos y realizan acciones organizadas a través de métodos que permiten cambiar atributos o estados del objeto o de otros objetos de la clase.
-
Y Listo!! Ya sabes mucho sobre clases; es hora de ponerlo en practica!!
🖋️ Sintaxis de clases en python y algunos ejemplos
Para crear una clase recurrimos a la expresión class seguida del nombre de la clase y entre paréntesis la clase de la cual hereda (una clase puede recibir atributos y métodos de otra).Al momento de crear una clase si este parámetro entre paréntesis no se declara; la clase automáticamente heredara de Object (que es una clase predefinida osea existente en el propio lenguaje por defecto.). Seguidamente colocamos dos puntos y debajo (dentro del bloque de código) definimos el método constructor de la clase seguido también de paréntesis para establecer parámetros y luego colocamos dos puntos «:» teniendo así dentro de la clase otro bloque de código.
ClassNombredelaclase (object): #Declaramos la clase nuestra que hereda deObject
def__init__(self,parámetros): #Constructor de la clase
#Declaración de atributos
🏗️ El método constructor de las clases en Python (__init__)
Si hablamos de métodos en clases en python sabemos que pueden existir diferentes tipos de ellos. Pero el mas importante es el método constructor; el cual dicho nombre hace referencia a inicializar los atributos del objeto creado a partir de la clase que lo posea. Por supuesto no es necesario que este método exista dentro de una clase para que la clase exista. Pero si es necesario para indicarle al interprete de Python que cuando se Instancia un objeto a dicha clase debe asignarle los argumentos que nosotros le damos al momento de la instancia. (inicialización de atributos)
- Este método se escribe «__init__» y yo para recordarlo lo suelo asimilar con «inicializar». Una clase que posea este método creara el objeto con los «argumentos» para los atributos que se pasen al momento de la instancia.
- Elmétodo__init__NO RETORNA NINGÚN DATO Y ES OPCIONAL. Cuando decimos que no retorna ningún dato significa que a diferencia de otros métodos este no puede retornar valores luego de ejecutado.
- Este métodoes llamado automáticamente al instanciar un objeto a la clase que tenga el constructor por lo que su uso es muy común y practico.
-Y tu te preguntaras y si es opcional ¿Para qué quiero yo aprenderlo?
Pues el método constructor nos permitirá asignar atributos cada vez que creemos un objeto a partir de esa clase haciéndolo obligatorio. Y además nos permitirá llamar métodos de la clase sin instanciar; entre otras cosas.
Supongamos que debo crear 50 objetos a partir de la misma clase y todos esos métodos tendrán el atributo «color».
Creamos la clase producto y el método constructor donde definimos que el atributo color sera igual al parámetro color que pasemos en el indice «0» (cero; primer parámetro).
ClassProducto():
Constructor __init__(self, color) :
self.color = color #Atributo
Instanciamos objetos:
- Objeto1 =Producto(«AZUL»)
- Objeto2 =Producto(«ROJO»)
- Objeto3 =Producto(«NEGRO»)
No necesitas especificar que el argumento «AZUL» por ejemplo; corresponde al atributo color aunque tuvieras más de un atributo el interprete se guía por el orden (indice) en que le pasamos argumentos y declaramos parámetros.
En estos ejemplos no respeto sintaxis del todo. Solo es para que el usuario promedio comprenda la diferencia.
🖋️ Sintaxis de clases en python e instancia + Ejemplo
Dijimos que instanciar era crear un objeto a partir de una clase. Así que creemos de ejemplo la clase Humano con el constructor anterior que luego explicare más abajo!!.
#!/usr/bin/env python # -*- coding: utf-8 -*- class Humano: # Creamos la clase Humano def __init__(self, edad, nombre): # Definimos los atributos edad y nombre self.edad = edad # Asignamos el valor de edad al atributo self.edad self.nombre = nombre # Asignamos el valor de nombre al atributo self.nombre # Creamos una instancia de la clase Humano persona1 = Humano(31, "Pedro")
Como puedes ver:
- Creamos la clase Humano.
- Dentro de ella creamos el método constructor utilizando la palabra reservada def seguida del constructor __init__ y luego entre paréntesis colocamos los parámetros; donde el primero es una palabra reservada self (que refiere al objeto mismo; ya lo veremos más adelante) y seguido nuestros atributos separados por coma.
- Indicamos mediante self.nombreatributo que nuestro parámetro es igual al argumento que pasemos como valor al momento de la instancia. Diciéndole al interprete que cuando pasemos edad y nombre; sean iguales a edad y nombre.
- Ahora para crear un objeto de la clase Humano debemos definir un nombre para nuestro objeto e indicar mediante el operador de asignación «=» que pertenece a la clase Humano y dentro de paréntesis indicar los valores (argumentos) para «edad» y «nombre» (que son parámetros). En este caso fue 31 y «pedro».Fíjate que el orden debe ser igual a como definiste los argumentos en el constructor de la clase.
➕ Añadiendo nuevos métodos y atributos a clases en python
En este caso vamos a jugar con la clase Humano. Donde tendremos tres atributos«Edad», «Nombre» y «Ocupación». Y me gustaría que creáramos métodos que nos detallen el nombre, edad y ocupación de cada objeto:
Para este ejemplo de clases en python usaremos el mismo código anterior. Así no te pierdes; en el código anterior ya teníamos dos atributos. Edad y Nombre; ahora vamos a agregar un tercer atributo «Ocupacion» (sin acento), pero sabemos que se refiere a su empleo, oficio, etc.
#!/usr/bin/env python # -*- coding: utf-8 -*- class Humano: # Creamos la clase Humano def __init__(self, edad, nombre): # Definimos los parámetros edad y nombre self.edad = edad # Asignamos el valor de edad al atributo self.edad self.nombre = nombre # Asignamos el valor de nombre al atributo self.nombre # Creamos una instancia de la clase Humano persona1 = Humano(31, "Pedro")
Bien en el método constructor debemos añadir nuestro nuevo atributo de instancia «Ocupacion». Si esta dentro del constructor es un atributo de instancia lo que significa que debe especificarse un «valor» al momento de crear el objeto a partir de esta clase.
Así que lo añadimos como parámetro dentro del paréntesis del constructor__init__y también dentro del mismo utilizando self («este o si mismo» [se refiere al objeto creado a partir de la clase. Instanciado]). Fíjate:
#!/usr/bin/env python # -*- coding: utf-8 -*- class Humano: # Creamos la clase Humano def __init__(self, edad, nombre, ocupacion): # Definimos los parámetros edad, nombre y ocupación self.edad = edad # Asignamos el valor de edad al atributo self.edad self.nombre = nombre # Asignamos el valor de nombre al atributo self.nombre self.ocupacion = ocupacion # Asignamos el valor de ocupación al atributo self.ocupacion # Creamos una instancia de la clase Humano persona1 = Humano(31, "Pedro", "Desocupado")
Como ves inmediatamente también añadí el argumento «Desocupado» en la instancia. Pues fíjate que se respeta el orden de estos argumentos para cada parámetro definido en el constructor de la clase. OJO a eso!
➕ Añadiendo un nuevo método de instancia
Ya hablamos del método constructor. Ahora aprendamos los métodos tradicionales que son los Métodos de clase (puesto que existen 3 tipos de métodos; pero nos enfocaremos en el de clase que es el más habitual. Ya tendremos tiempo de estudiar los demás tipos!!)
Entonces en nuestro código anterior yo quisiera agregar un método para retornar el valor de cada argumento de mi objeto Persona1. Puesto que como has visto ya tenemos nuestro objeto creado y todo. Pero NO HACE NADA!. Si ejecutas el código en consola no obtienes error de sintaxis pero tampoco obtienes ninguna salida!. Así que venga!. Vamos a crear un método de clase que al ejecutarlo nos devuelva toda la información de nuestro objeto.
Para crear un método lo hacemos a través de la palabra reservada def (al igual que las funciones o como la utilizamos para crear nuestro método constructor). Seguido a ella el nombre del método y luego entre paréntesis los parámetros; finalmente dos puntos «:» y continuamos debajo identando. Como tu ya sabrás!
#!/usr/bin/env python # -*- coding: utf-8 -*- class Humano: # Creamos la clase Humano def __init__(self, edad, nombre, ocupacion): # Definimos los parámetros edad, nombre y ocupación self.edad = edad # Asignamos el valor de edad al atributo self.edad self.nombre = nombre # Asignamos el valor de nombre al atributo self.nombre self.ocupacion = ocupacion # Asignamos el valor de ocupación al atributo self.ocupacion # Creación de un nuevo método def presentar(self): presentacion = "Hola soy {}, mi edad es {} y mi ocupación es {}" # Mensaje de presentación print(presentacion.format(self.nombre, self.edad, self.ocupacion)) # Usamos format para completar el mensaje # Creamos una instancia de la clase Humano persona1 = Humano(31, "Pedro", "Desocupado") # Llamamos al método presentar() persona1.presentar()
Resultado:
Hola soy Pedro, mi edad es 31 y mi ocupación es Desocupado
En este caso dentro de los parámetros del método incluimos self para hacer referencia al objeto instanciado aunque todavía no sepamos su nombre. Entonces simplificamos su sintaxis siendo:
def NombredelMetodo (self, parámetros):
Declaraciones
Y para llamar el mismo
Objeto.NombredelMetodo(parámetros)
✏️ Cambiar atributos mediante métodos
Así de fácil aprendimos a crear y llamar métodos; estos métodos también pueden modificar atributos fíjate el siguiente ejemplo (creamos otro método para modificar el atributo ocupación):
#!/usr/bin/env python # -*- coding: utf-8 -*- class Humano: # Creamos la clase Humano def __init__(self, edad, nombre, ocupacion): # Definimos los parámetros edad, nombre y ocupación self.edad = edad # Asignamos el valor de edad al atributo self.edad self.nombre = nombre # Asignamos el valor de nombre al atributo self.nombre self.ocupacion = ocupacion # Asignamos el valor de ocupación al atributo self.ocupacion # Creación de un nuevo método def presentar(self): presentacion = "Hola soy {}, mi edad es {} y mi ocupación es {}" print(presentacion.format(self.nombre, self.edad, self.ocupacion)) # Creamos un nuevo método para cambiar la ocupación # En caso de que esta persona sea contratada def contratar(self, puesto): # Añadimos un nuevo parámetro en el método self.puesto = puesto print("{} ha sido contratado como {}".format(self.nombre, self.puesto)) self.ocupacion = puesto # Ahora cambiamos el atributo ocupación # Creamos una instancia de la clase Humano persona1 = Humano(31, "Pedro", "Desocupado") # Llamamos al método presentar() persona1.presentar() # Contratamos a la persona y luego presentamos de nuevo persona1.contratar("Obrero") persona1.presentar()
Esta practica es ideal. Lo más practico es crear métodos para modificar los atributos de nuestros objetos. En las clases en python (lo veremos más adelante), siempre deben crearse las variables de atributos como privadas y ser modificadas mediante métodos públicos. De esta forma se conserva el principio de encapsulamiento. Tenerlo en cuenta; aunque aún no lo hallas aprendido que conviene crear métodos para cada cambio a realizar en los atributos.
🤙 Self en Python
Seguramente te habrás dado cuenta y lo habré mencionado antes. Self no es en realidad una palabra reservada del lenguaje. Esta hace referencia al objeto en instancia pero no obligadamente tiene que tener ese nombre. Es como «This» en java. Pero en Python podemos usar cualquier nombre en vez de Self; aunque es buena practica simplemente usar self para no descolocarse.
Esto ha sido todo, espero te haya gustado, si es así no dudes en compartirlo y comentarlo. Muchas gracias!!