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.
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.
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 self
pará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