Clases en Python (Programación orientada a objetos)

Python como bien sabrás es un lenguaje orientado a objetos; anteriormente aprendimos algunas estructuras de datos (Listas; Tuplas, etc.) y también  estructuras de control (Condicionales; Bucles; etc.). Pero si no hablamos de clases en Python nos estamos refiriendo a aprender solo programación estructurada.

Python admite OOP y Programación estructurada

Clases y métodos en PythonPuesto que Python admite estos dos paradigmas de programación (Programación estructurada y Programación orientada a objetos ) pudimos aprender primero a crear programas sin recurrir obligadamente a conceptos de programación orientada a objetos mediante el entendimiento de la programación estructurada.

Entonces llega el momento de programar pensando orientado a objetos; aprendiendo el correcto manejo de Clases en Python. Pero no te preocupes que en Python estos dos paradigmas se unifican al momento de utilizar clases. (Es decir que estaremos usando ambos paradigmas).

Y no solo estarás aprendiendo Python; sino que estarás aprendiendo el fundamento de la OOP (Oriented Object Programming) que te facilitará aprender luego otros lenguajes de programación que utilicen este paradigma.

 

 

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.

Clases en PythonImagina 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.

Objetos programaciónEs 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 la Clase: Animal
  • El objeto instanciado (creado a partir de esa clase): Perro
  • Que tiene sus atributos:
      • Color: negro;
      • Raza: Coquer;
      • Tiene collar: True (si))
  • Y tiene sus mé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 cierta sintaxis y 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

 

Ejemplo clases y objetos en python

  • 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.

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.

Class Nombredelaclase (object): #Declaramos la clase nuestra que hereda de Object

      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 de una clase puede 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.
  • El mé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étodo es 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).

Class Producto():

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!!. Ve despacio coño!

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

class Humano(): #Creamos la clase Humano
    def __init__(self, edad, nombre): #Definimos el atributo edad y nombre
        self.edad = edad # Definimos que el atributo edad, sera la edad asignada
        self.nombre = nombre # Definimos que el atributo nombre, sera el nombre asig

Persona1 = Humano(31, "Pedro") #Instancia

Como puedes ver:

  1. Creamos la clase Humano.
  2. 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.
  3. 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.
  4. 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 Persona.étodos también pue

Para este ejemplo 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 el parámetro edad y nombre
        self.edad = edad # Definimos que el atributo edad, sera la edad asignada
        self.nombre = nombre # Definimos que el atributo nombre, sera el nombre asig

Persona1 = Humano(31, "Pedro") #Instancia

 

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 el parámetro edad , nombre y ocupacion
        self.edad = edad # Definimos que el atributo edad, sera la edad asignada
        self.nombre = nombre # Definimos que el atributo nombre, sera el nombre asig
        self.ocupacion = ocupacion #DEFINIMOS EL ATRIBUTO DE INSTANCIA OCUPACION

Persona1 = Humano(31, "Pedro", "Desocupado") #Instancia

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 el parametro edad , nombre y ocupacion
        self.edad = edad # Definimos que el atributo edad, sera la edad asignada
        self.nombre = nombre # Definimos que el atributo nombre, sera el nombre asig
        self.ocupacion = ocupacion #DEFINIMOS EL ATRIBUTO DE INSTANCIA OCUPACION
        
        #Creación de un nuevo método
    def presentar(self):
        presentacion = ("Hola soy {}, mi edad es {} y mi ocupación es {}") #Mensaje
        print(presentacion.format(self.nombre, self.edad, self.ocupacion)) #Usamos FORMAT

Persona1 = Humano(31, "Pedro", "Desocupado") #Instancia

#Llamamos al método

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 el parámetro edad , nombre y ocupación
        self.edad = edad # Definimos que el atributo edad, sera la edad asignada
        self.nombre = nombre # Definimos que el atributo nombre, sera el nombre asig
        self.ocupacion = ocupacion #DEFINIMOS EL ATRIBUTO DE INSTANCIA OCUPACIÓN
        
        #Creación de un nuevo método
    def presentar(self):
        presentacion = ("Hola soy {}, mi edad es {} y mi ocupación es {}") #Mensaje
        print(presentacion.format(self.nombre, self.edad, self.ocupacion)) #Usamos FORMAT
        
        
        #Creamos un nuevo método para cambiar la ocupación:
		#En caso 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
Persona1 = Humano(31, "Pedro", "Desocupado") #Instancia

#Llamamos al método

Persona1.presentar() 
Persona1.contratar("Obrero")
Persona1.presentar() #Lo volvemos a presentar luego de su contratación

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!! Bye bye

 

 

 

 


 

Sigue leyendo!
Entrada anterior! Siguiente entrada!
Compartir es agradecer! :)

23 comentarios en “Clases en Python (Programación orientada a objetos)”

  1. Muy buen contenido. Explicación muy gráfica y clara especialmente para los que no tenemos conocimiento de desarrollo y que hasta ahora estamos comenzando en este mundo. Muchas gracias. Seguramente, en adelante seré un fiel seguidor de pythones.

  2. Manuel Márquez Cruz

    Muchas gracias por la información. Es mi primer acercamiento a Python y me ha sido muy útil. Sin embargo, al ejecutar el mismo código, me da error:
    TypeError: Humano() takes no arguments
    Lo he repasado y vuelto a repasar y no sé que he podido hacer mal.
    Un saludo.

    1. Hola lo he vuelto a probar al codigo y se ejecuta sin errores. Si a este te refieres:
      #!/usr/bin/env python
      # -*- coding: utf-8 -*-

      class Humano(): #Creamos la clase Humano
      def __init__(self, edad, nombre, ocupacion): #Definimos el parametro edad , nombre y ocupacion
      self.edad = edad # Definimos que el atributo edad, sera la edad asignada
      self.nombre = nombre # Definimos que el atributo nombre, sera el nombre asig
      self.ocupacion = ocupacion #DEFINIMOS EL ATRIBUTO DE INSTANCIA OCUPACION

      #Creación de un nuevo método
      def presentar(self):
      presentacion = ("Hola soy {}, mi edad es {} y mi ocupación es {}") #Mensaje
      print(presentacion.format(self.nombre, self.edad, self.ocupacion)) #Usamos FORMAT

      #Creamos un nuevo metodo para cambiar la ocupación:
      #En caso que esta persona sea contratada

      def contratar(self, puesto): #añadimos un nuevo parametro 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
      Persona1 = Humano(31, "Pedro", "Desocupado") #Instancia

      #Llamamos al método

      Persona1.presentar()
      Persona1.contratar("Obrero")
      Persona1.presentar() #Lo volvemos a presentar luego de su contratación

      Fíjate si estas pasando bien los argumentos al momento de instancia de la clase humano.. Pues el error que el interprete te marca es justamente de argumentos porque o bien están mal definidos en la clase o en el momento de la instancia no se brinda la cantidad o el tipo correcto. Un saludo gracias por el leer el blog

      1. Manuel Márquez Cruz

        Muchas gracias por la respuesta. Copié tu código, lo pegué y funcionó. El que yo escribí, no. Lo he vuelto a repasar minuciosamente y no sé que error he cometido, pero da igual, he apendido y seguiré aprendiendo con tu tutorial.
        Muchas gracias.

    1. Hola @JAVIER si es lo que creo, ¿lo que quieres hacer es pasarle a una clase un fichero (pongamosle un txt) como atributo?. El fichero en sí no puede ser un atributo, si lo podría ser su «dirección», lo que sería entonces nada más que la dirección a la que luego mediante un método de la clase recurras a abrir el archivo allí alojado. Simplemente pasas su «dirección» como cualquier otro argumento para el atributo de clase por ejemplo «ruta» y luego mediante un método usando la función Open lo abres y trabajas con el, etc.. Saludos

  3. Hola! Gracias por la excelente explicación. No obstante, he seguido el código paso a paso, y no logro ejecutarlo, arroja error: TypeError: Humano() takes no arguments

  4. Hola revisa bien tu código porque en mi caso no da ningún error. Pero según veo el error traducido sería que la clase Humano no recibe argumentos. Revisa si en la instancia estás dando argumentos a cada parámetro de la clase y revisa en el método de creación de la clase __init__ que este sea correcto. Al parecer la clase se crea sin admitir argumentos!. Saludos

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.