Codea Blog  

Blog Details

Programación Orientada a Objetos en Python

INTRODUCCIÓN

 

La programación orientada a objetos (POO) es un enfoque fundamental en el desarrollo de software, ampliamente utilizado en diversas industrias y aplicaciones. Su importancia radica en su capacidad para estructurar y organizar el código de manera modular, permitiendo una mayor reutilización, flexibilidad y mantenibilidad del software.

 

A diferencia de otros tipos de programación, como la programación estructurada, la POO se basa en la idea de modelar el mundo real a través de la creación de objetos que tienen atributos y comportamientos. Los objetos son instancias de clases, que actúan como plantillas o moldes que definen la estructura y el comportamiento de los objetos.

 

En este articulo, el objetivo es compartir los conceptos principales de la POO a través de ejemplos relacionados con la industria minera. Se explorara cómo se pueden representar equipos mineros como camiones, palas y perforadoras utilizando clases y cómo se pueden aplicar los conceptos de herencia, encapsulamiento y polimorfismo en este contexto. A través de estos ejemplos, se espera proporcionar una comprensión clara y práctica de la importancia y los beneficios de la POO en el desarrollo de software para la industria minera.

 

CONCEPTOS FUNDAMENTALES

 

CLASES

Para comprender la importancia de crear una clase, podemos tomar como ejemplo la gestión de camiones. Supongamos que necesitamos realizar un seguimiento de la cantidad de camiones con diferentes atributos, como el modelo y la capacidad de carga. Si utilizamos una lista para almacenar estos camiones, podríamos asignar el primer elemento a representar el modelo del camión y el segundo elemento a representar su capacidad de carga. Sin embargo, a medida que aumenta la cantidad de camiones, se vuelve cada vez más difícil identificar qué elemento representa qué atributo. Además, si deseamos agregar más propiedades a los camiones, como la marca o velocidad, este enfoque se vuelve aún más desorganizado y difícil de mantener. Aquí es donde entra en juego la necesidad de las clases.

 

Una clase es un entidad que se utiliza como una plantilla o molde donde se define los métodos y atributos de un objeto en particular. Estas clases van a permitir crear objetos de una manera mas ordenada. Sin embargo, es importante destacar que cada objeto creado a partir de esa clase tendrá sus propios valores para esos atributos, lo que les dará su individualidad, a pesar de compartir los mismos métodos.

 

CÓMO DEFINIR UNA CLASE

Para crear una clase se usa la palabra clave class, seguida del nombre de la clase y dos puntos. Cualquier código o método que identado debajo de la definición de la clase se considera parte del cuerpo de la clase.

 

Aquí ejemplos de clases:

class  camion:
    pass

class  pala:
    pass

class  taladro:
    pass

class  poligono:
    pass

 

La clase camion tiene un cuerpo que se compone únicamente de la palabra clave "pass". La palabra clave "pass" se utiliza frecuentemente como un marcador de posición que indica que se espera que se agregue código en ese lugar en el futuro. Esta declaración permite ejecutar el código sin generar un error en Python.

 

Importante: Los nombres de clases se suelen escribir en formato CamelCase para conservar un orden y evitar errores.

 

OBJETOS E INSTANCIA

Una clase es un modelo de cómo debe definirse algo, pero en realidad no contiene ningún dato. Sin embargo cuando este modelo o clase se llena con información real, se esta creando una objetivo único e irrepetible al cual se le denomina instancia.

 

En otras palabras, se puede entender una clase como un formulario que define una estructura y un conjunto de preguntas. Este formulario puede llenarse por diferentes personas con sus propias respuestas únicas. Cada respuesta es un instancia diferente y se han creado bajo una sola clase.

 

CÓMO CREAR UNA INSTANCIA

Considerando la clase camion, se puede instanciar un nuevo objeto camion escribiendo el nombre de la clase, seguido de paréntesis de apertura y cierre:

 

class  camion:
     pass

camion(), camion()

 

Ahora tiene un nuevo objeto camion en 0x7f43c76cee00. Esta cadena de letras y números es una dirección de memoria que indica dónde el objeto camion se almacena en la memoria de su computadora.

 

Si creamos un segundo objeto camion, se creara una nueva instancia. La nueva instancia del objeto camion se encuentra en una dirección de memoria diferente. Esto se debe a que es una instancia completamente nueva y es completamente única desde el primer  objeto camion que se creo. Entonces las instancias son únicas e irrepetibles por cada objeto que se crea dentro de una clase.

 

ATRIBUTOS

Un atributo es una característica o propiedad que describe un objeto, cuyo valor puede ser alterado por la ejecución de algún método. Por ejemplo los atributos de la clase camion pueden ser su modelo, nombre, capacidad, velocidad, etc.

 

class  camion:

      marca= "Caterpillar"

      def  __init__ (self, modelo, nombre, capacidad):

            self.modelo = modelo

            self.nombre = nombre

            self.capcidad = capacidad

 

La manera correcta de pasar los argumentos a los parámetros  modelo , clase y capacidad , es colocando los valores dentro de un paréntesis luego del nombre de la clase. Si se llama los atributos sin haber ingresado información, entonces Python genera un TypeError.

 

HT001 = camion("797 F", "HT001", 400)

HT030 = camion("794 AC", "HT030", 320)

 

HT001.capacidad

 

De esta manera se esta creando dos instancias nuevas para la clase camion. Una instancia para el camión HT001 de modelo 797 F con capacidad nominal de 400 y otro para el camión HT030 de modelo 794 AC con capacidad nominal de 320.

 

El método camion de la clase __init__()tiene cuatro parámetros, entonces, ¿por qué solo se le pasan tres argumentos en el ejemplo?

Cuando se crea un objeto camion, Python crea una nueva instancia y pasa ese código unico al primer parámetro de __init__(), por ello se elimina el selfparámetro.

 

MÉTODOS

Desde el punto de vista del comportamiento, un método es lo que el objeto puede hacer. Asimismo método es una función que forma parte de una clase o de un objeto. En su ámbito tiene acceso a otros métodos y atributos de la clase o del objeto al que pertenece y puede producir un cambio en las propiedades del objeto (atributo).

 

Método __ init__

Es un método especial utilizado para inicializar un objeto cuando se crea una instancia de una clase. Se conoce como el constructor de la clase.

 

El método __init__ se define dentro de la clase y se llama automáticamente al crear un nuevo objeto de esa clase. Su propósito principal es establecer los valores iniciales de los atributos del objeto.

 

El primer parámetro del método __init__, por convención, se llama self y hace referencia al objeto en sí mismo. Los demás parámetros seran los atributos principales del objeto.

 

EJEMPLO - MÉTODO REPRESAJE

El método repesaje es una función definida en una clase de camión, que se utiliza para verificar si un camión ha sido sobrecargado. Toma un parámetro llamado carga, que representa la cantidad de toneladas que marca la balanza del camión algunos metros después de salir del frente de pala.

 

El método compara la carga actual con la capacidad del camión, representada por el atributo capacidad del objeto camión. Si la carga es menor que la capacidad del camión, se imprime un mensaje indicando que se está cargando la cantidad especificada de toneladas en el camión. Por otro lado, si la carga es igual o mayor que la capacidad del camión, se imprime un mensaje indicando que el camión está sobrecargado.

 

class  camion:

      def  __init__ (self, modelo, nombre, capacidad, velocidad):

            self.modelo = modelo

            self.nombre = nombre

            self.capacidad = capacidad

            self.velocidad = velocidad

 

      def  repesaje (self, carga):

            if carga< self.capacidad:

                 print("Cargando", carga, "toneladas en el camión", self.modelo)

            else

                 print("Camión", self.modelo, "sobrecargado")

 

      def  tiempo_viajando_cargado (self, destino, distancia_destino):

             tiempo_vc= (distancia_destino/self.velocidad)*60

             print("El camión demora", tiempo_vc, "minutos para llegar a", destino)

 

      def  pases (self, pala, ton_bucket):

             Nbucket=self.capacidad/ton_bucket

             print("La pala", pala, "carga al camión", self.modelo, "con", Nbucket, "pases")

 

HERENCIA

 

De manera general la herencia puede considerar como el arte de reciclar código. La herencia se considera la característica más importante de la programación orientada a objetos. La capacidad de una clase para heredar métodos y/o características de otra clase se conoce como herencia.

 

La subclase o clase hija es la clase que hereda. La superclase o clase padre es la clase de la que se heredan los métodos y/o atributos. Aunque la analogía no es perfecta, se puede pensar en la herencia de objetos como herencia genética.

 

Es posible que hayas heredado el color de tu cabello de tu madre. Es un atributo con el que naciste. Digamos que decides teñir tu cabello de morado. Suponiendo que su madre no tenga el cabello morado, acaba de anular el atributo de color de cabello que heredó de su madre.

 

EJEMPLO DE HERENCIA

En este caso, se definen dos clases adicionales: camion_tripulado y camion_autonomo, que son subclases de la clase base camion. Esto significa que las subclases heredan los atributos y métodos de la clase base.

 

En el caso de camion_tripulado, se hereda de la clase base camion. La subclase tiene su propio método __init__, que recibe algunos parámetros adicionales específicos de un camión tripulado. En el método __init__ de la subclase, se utiliza super().__init__(...) para llamar al método __init__ de la clase base y heredar los atributos modelo, nombre, capacidad y velocidad. Luego se define un nuevo atributo específico de la subclase llamado operador.

 

class  camion_tripulado(camion):

     def  __init__(self, modelo, nombre, capacidad, velocidad, operador):

          super().__init__(modelo, nombre, capacidad, velocidad)

          self.operador = operador


     def  operador (self):

            print(self.operador, "operador el camión", self.nombre, "del modelo", self.modelo)

 

class  camion_autonomo(camion):

     def  __init__(self, modelo, nombre, capacidad, velocidad, controlador):

          super().__init__(modelo, nombre, capacidad, velocidad)

          self.controlador = controlador


     def  controlador (self):

            print(self.controlador, "controla el camión", self.nombre, "del modelo", self.modelo)

 

De manera similar, la clase camion_autonomo hereda de la clase base camion. En su método __init__, se utiliza super().__init__(...) para llamar al método __init__ de la clase base y heredar los atributos. La subclase también define un nuevo atributo específico llamado controlador. Además, tiene un método adicional llamado controlador que imprime información sobre el controlador del camión.

 

POLIMORFISMO

 

El término ' polimorfismo ' proviene del idioma griego y significa 'algo que toma múltiples formas'.

 

El polimorfismo se refiere a la capacidad de una subclase para adaptar un método que ya existe en su superclase para satisfacer sus necesidades. Para decirlo de otra manera, una subclase puede usar un método de su superclase tal cual o modificarlo según sea necesario.

 

EJEMPLO DE POLIMORFISMO

El ejemplo proporcionado muestra el polimorfismo en acción a través de la implementación de diferentes clases que comparten un método común llamado "capacidad". Cada clase representa un tipo específico de camión y tiene una implementación diferente del método "capacidad".

 

La clase base "camion" define el método "capacidad" con la declaración de "pass", lo que indica que no se realiza ninguna acción en esta clase. Las clases "CAT_797" y "CAT_794" son subclases de la clase base "camion" y también tienen un método llamado "capacidad", pero con implementaciones diferentes.

 

La clase "CAT_797" tiene una implementación del método "capacidad" que imprime "Tiene una capacidad de 400 ton", indicando que el camión CAT 797 tiene una capacidad de carga de 400 toneladas.

 

La clase "CAT_794", por otro lado, tiene una implementación del método "capacidad" que imprime "Tiene una capacidad de 320 ton", lo que significa que el camión CAT 794 tiene una capacidad de carga de 320 toneladas.

 

Cuando se crea una instancia de cada clase y se llama al método "capacidad", el comportamiento polimórfico se muestra. Dependiendo del tipo de camión creado (CAT 797 o CAT 794), se ejecutará la implementación correspondiente del método "capacidad".

 

class  camion:
     def  capacidad(self):
         pass

class  CAT_797:
     def  capacidad (self):
          print("Tiene una capacidad de 400 ton")

class  CAT_794:
      def  capacidad (self):
            print("Tiene una capacidad de 320 toneladas")

 

ENCAPSULACIÓN

 

La encapsulación es el proceso de evitar que los clientes accedan a ciertas propiedades, a las que solo se puede acceder a través de métodos específicos.

 

Los atributos privados son atributos inaccesibles, y la ocultación de información es el proceso de convertir atributos particulares en privados. Utiliza dos guiones bajos para declarar características privadas.

 

EJEMPLO DE ENCAPSULAMIENTO

Esta clase camion tiene varios atributos como "modelo", "nombre", "capacidad" y "__kilometraje". El atributo "__kilometraje" está marcado con doble guion bajo al principio, lo que indica que es un atributo privado.

 

El método "init" es el constructor de la clase y se encarga de inicializar los atributos del camión, incluyendo el atributo privado "__kilometraje". El valor del "__kilometraje" se pasa como argumento al crear una instancia de la clase.

 

Luego, la clase tiene un método llamado "Kkilometraje", que actúa como un getter para el atributo privado "__kilometraje". Este método permite acceder al valor del kilometraje desde fuera de la clase. Retorna el valor almacenado en "__kilometraje" cuando se llama.

 

El encapsulamiento se logra al marcar el atributo "__kilometraje" como privado al usar el doble guion bajo al principio de su nombre. Esto significa que el atributo no debería ser accesible directamente desde fuera de la clase. Sin embargo, al proporcionar un método getter como "Kkilometraje", se permite un acceso controlado y seguro al valor del kilometraje.

 

class  camion:

     def  __init__(self, modelo, nombre, capacidad, kilometraje):

           self.modelo = modelo

           self.nombre = nombre

           self.capacidad = capacidad

           self.__kilometraje = kilometraje

 

     def  kkilometraje (self):

        return self.__kilometraje

 

CONCLUSIONES

En resumen, este trabajo ha explorado los conceptos fundamentales de la programación orientada a objetos (POO) en la industria minera. Se ha enfatizado la importancia de la POO para organizar y estructurar el código de manera modular, lo que resulta en software más eficiente y flexible. La capacidad de representar entidades mineras con precisión y coherencia mediante clases, objetos, atributos, métodos, herencia, encapsulamiento y polimorfismo mejora la comprensión y colaboración en el desarrollo de software.

 

La relevancia de la POO en la minería se debe a la complejidad de los sistemas y equipos utilizados. La capacidad de modelar equipos mineros específicos como objetos con atributos y comportamientos permite soluciones más sofisticadas y adaptadas a las necesidades de la industria.


REFERENCIAS

https://www.programiz.com/python-programming/object-oriented-programming

https://www.datacamp.com/tutorial/python-oop-tutorial https://github.com/louis-stp/Match-Factor-Solver/blob/main/match_factor.py

https://www.geeksforgeeks.org/python-oops-concepts/

https://aprendepython.es/core/modularity/oop/

 

Comentarios

Registrate o Inicia Sesión para comentar y obtener Cursos de pago gratis

function loadurl(){ var val1 = document.getElementById("valor3").value; console.log(val1); if(val1){ window.location = "/comunidad/blog/filtrar/"+val1+"/"} }