Tutorial de Python orientado a objetos En la primera llave creamos una clase llamada Gelantia. En la primera parte def __ init__(self, tam, color, sabor): definimos las características del objeto. En la segunda parte def desplegarC(self): podremos recuperar la información que le hemos asignado al objeto. En la segunda llave le damos las propiedades a los objetos gel1, gel2 y gel2. En la llave tres llamamos a def DesplegarC(self): para ver las propiedades que le hemos asignado a los objetos. 1 Otro ejemplo para que tú lo analices 2 Python Poo Herencia Este será el resultado: 3 Herencia múltiple Hemos definido una nueva clase llamada Telefono. La hereda la clase Celular, que recibe herencia múltiple ya que recibe la herencia Electrodomestico. Ya podemos utilizar cel.llamar() y cel.colgar() que definimos en la clase Telefono. 4 Este será el resultado: Nota: Si las clases Electrodometicos y Telefonos tuvieran un método con el mismo nombre tiene prioridad la herencia que se encuentran a la izquierda es este caso cogería el método de Electrodomestico. 5 Python Poo Encapsulamiento Como podrás observar a la hora de dar atributos a una clase podemos definir un atributo de tipo privado self.__dia = dia, si lo queremos recuperar nos dará un mensaje de error, en el resultado podrás observar como el valor del mes si lo podemos visualizar pero el valor del día nos da un mensaje de error. 6 La llave grande define la creación de la clase Nacimiento. Al método def ___init__(self): no le pasamos parámetros, se los asignamos en las líneas continuas. Verás que el primer valor que le asignamos es self. __anio = 2000, el doble guion bajo hacemos que la variable sea de tipo privada, es decir que no tendremos acceso directamente como en los ejemplos anteriores. Definimos un método set que al estar dentro de la clase tiene acceso al valor de las variables, en este caso def setMes(self, mes): que admite como parámetro el valor del mes y antes de ser asignado comprueba si esta valor es correcto o no, si es correcto lo asigna con self.__mes = mes y si es falso retorna un mensaje print(“Mes invalido.”). Para poder ver la información del mes que no es pública utilizaremos el método get Def getMes(self): dond nos retornoará el valor de self.__mes. Después de crear un objeto de tipo Nacimiento 7 objeto = Nacimiento() Le pasamos al mes le damos el valor 45 objeto.setMes(45). Para ver el resultado print (objeto.getMes()) como no es un mes correcto imprime “Mes invalido”, e imprime el valor que se le asignó al principio. A continuación al mes le damos el valor 6 objeto.setMes(6). Para ver el resultado print (objeto.getMes()) como el valor es correcto imprime el número 6. 8 Python Poo Estructura de Datos – Lista Vamos a crear tres clases una llamada la clase Nodo, la clase Lista y la clase principal. Vamos a especificar todas las cosas que van a tener el elemento de la lista. En este ejemplo vamos a trabajar con nombre y edad. Dentro del Nodo vamos a crear el método def __init(self): Con self. Definimos los objetos Nombre = vacío y edad = 0. Mediante self.siguiente = None (con esto conseguimos apuntar el al siguiente nodo. Nombre Edad Siguiente Nombre Edad Siguiente Nada Nombre Edad Siguiente Nombre Edad Siguiente Nada Definimos nuestro método principal def __init__(self): Self.raiz = Nodo() Al objeto raíz le asignamos el método Nodo() que estará vacía. 9 Ahora vamos a crear el método insertar. Con el primer ‘if’ controlamos que si el nombre del primer elemento de la lista está vacia el método raíz va a insertar el nodo al primer elemento. Si no ‘else’ definimos la variable aux = self.raiz para que guarde la posición donde tenemos que insertar el nuevo nodo. (Nombre y Edad). En un bucle while, mientras este sea True que compare si aux.siguinete == None (vacio), después le pasamos al objeto aux.siguiete el valor de nodo, si se cumple se rompe el bucle y sino la variable aux asume el valor de aux.siguiente. Ahora vamos a crear el método consultar. El objeto aux y aux2 se van a encargar a recoger toda la lista entre todos sus elementos. Con el primer ‘if’ controlaremos si la lista está vacia, si es así nos mostrará el siguiente mensaje ‘La lista está vacia’. Sino ‘else’ que imprima el nombre y la edad y mientas ‘while’ el objeto aux.siguiente sea ¡= (distinto) de vacío, accedemos al siguiente para que lo muestre. 10 Ahora vamos a crear el método eliminar. Para ello vamos a crear un objeto llamado aux = self.raiz para ir haciendo el recorrido. Si ‘if’ aux.nombre == None (vacio) que nos diga que no hay elementos que se puedan eliminar. Sino ‘else’ elemento = input(“Escribe el nombre a eliminar”) que lo asignaremos a la variable elemento. Si aux.nombre == elemento: la persona que queremos eliminar y además el valor de la lista siguiente está vacio, creamos un nuevo Nodo() con lo cual quedará totalmente vacia. Mientas ‘while’ aux.nombre ¡= None (distinto a vacío) agregaremos una condición. Sino ‘else’ pasmos los valores de la lista siguiente a la lista actual ‘self.raiz = aux.siguiente’ La variable ‘t’ de tipo boolean le asignamos el valor True. Sino ‘else’ mientras ‘while’ aux.siguiente ¡= None and t: aux = aux.siguiente (ir a la siguiente posición) Si aux.nombre == elementos (que estamos buscando) aux2.siguiente = aux.siguiente, el aux2.siguiente va una posición atrás del aux.siguiente. y al final aux = None y t = False aux y aux2 aux Nombre Edad Siguiente Nombre Edad Siguiente 11 Nombre Edad Siguiente En la clase principal vamos a instanciar un objeto lista de la clase Lista(). Creamos un menú con las siguientes opciones que se detallan con las llaves. Por mediación de input vamos a asignar un valor al objeto ‘opcion’ para que pueda realizar las opciones detalladas del 1 al 4. Si opción == 1 con ‘nodo = Nodo()’ vamos a instanciar un objeto nodo de la clase Nodo(). Preguntamos por el nombre y edad que se le asignan a sus correspondientes objetos. Con ‘lista.insertar(nodo)’ llamamos al método insertas. Si opción == 2 con ‘lista.consultar()’ llamamos al método consultar. Si opción == 3 con ‘lista.eliminar()’ llamamos al método eliminar. Si opción == 4 con break rompemos el bucle y termina el programa. Python Poo Estructura de datos Pila I Trabajando con Pilas. Guardar los valores del 1 hasta el 10 en la pila. Luego vemos los valores que hemos almacenado. Guardamos los valores del 1 hasta el 10 en la pila con ayuda del ciclo for y el parámetro range. Luego vemos los valores que hemos almacenado. Lo mismo pero con un rango de 1 hasta 100. Guardamos los valores del 1 hasta el 100, pero aquellos que sean pares, utilizando la condición elemento % 2 == 0, es decir que son divisible por 2 es decir pares. Luego vemos los valores que hemos almacenado. 12 Almacenamos en la pila los valores comprendidos entre 1 hasta 100 pero a su ver los multiplica por 5. Luego vemos los valores que hemos almacenado. Asignamos a la pila los valores del 1 hasta el 5. Vemos los valores que hemos almacenado. Con la instrucción pila.pop() eliminamos el último valor de la pila Y luego vemos los valores que tenemos almacenados y el número 5 ya no está. Con la instrucción pila.append(7) agregamos el valor 7 en la última posición de la pila Vemos los valores que hemos almacenado. 13 14 Hemos cambiado el código del método de la consulta para que muestre la información en modo de pila, este será el resultado: 15 Forma de pila Si queremos que cada vez que aparezca el menú se borre la pantalla. Para ejecutarlo desde Windows haremos doble clic sobre el archivo que hemos creado. 16 Ahora vamos a modificar el método eliminar() y el método consultar(): Ahora lo podrás ejecutar de nuevo. 17 Python POO Estructura de datos Pila II En la clase Nodo definimos un objeto que tendrá las siguientes variables: Nombre, edad y atras. En la clase Pilla creamos los siguientes métodos: El método inicial def __init__(self): tendrá una variable ‘self.topo = Nodo()’ El método def insertar(self, nodo): comparará si la variable nombre está vacía, si es así creará la pila para poder insertar el nombre y la edad sino se colocará antes de los datos que tiene la pila para introducir el nuevo dato. El método def eliminar(self): comprobamos si nombre está vacía, si es así que emprima el mensaje ‘La pila está vacía’ y un pause para poder ver el mensaje, sino self.tope si se situa antes del último valor, de este modo el puntero de dirección al siguiente dato se rompe, 18 imprime el valor que hemos eliminado, hay una pausa para poder ver el mensaje y si aux.atras es igual a nada que cree una nueva pila ‘self.tope = Nodo()’. Con el método def consultar(self): la variable aux asume el valor self.tope el final de la pila, si aux.nombre == Nove: (que está vacia) que imprima el mensaje ‘La pila está vacia’ sino es así mientas aux sea distinto a nada que imprima el nombre y la edad, con aux = aux.atras nos vamos a los datos anteriores para volverlos a imprimir, este bucle lo realizará mientras aux distinto a None, al final un pause para poder ver los datos. El método class Principal: crearemos un menú para que el usuario por teclado pueda elegir la opción que desee y con condiciones iremos llamando los correspondientes métodos. 19 Python POO Estructura de Datos-Cola I 20 Python POO Estructura de Datos-Cola II 21 22 Python POO Especial Agenda (Capítulo final) Vamos a crear una agenda: #Ejercicio Agenda import os class Archivo: def __init__(self): self.lista = [] def iniciarArchivo(self): archivo = open("agenda.txt","a") archivo.close() def escribirArchivo(self): archivo = open("agenda.txt","w") self.lista.sort() for elemento in self.lista: archivo.write(elemento+"\n") archivo.close() def cargarAgenda(self): archivo = open("agenda.txt","r") linea = archivo.readline() if linea: while linea: if linea[-1]=='\n': linea = linea[:-1] self.lista.append(linea) linea = archivo.readline() archivo.close() def crearContacto(self): nombre = input("escribe tu nombre: ") telefono = input("Escribe el teléfono de " + str(nombre) + " : ") correo = input("Escribe el correo de " + str(nombre) + " : ") self.lista.append(nombre + "$" + telefono + "$" + correo) def imprimirContacto(self): self.lista.sort() for elemento in self.lista: arreglo = elemento.split('$') print ("Nombre: " + arreglo[0] + "\t Teléfono: " + arreglo[1] + "\t Correo: " + arreglo[2]) print ("*******************************") 23 def buscarContacto(self): nombre = input("Inserta el nombre a buscar: ") Noencotrado = True for elemento in self.lista: arreglo = elemento.split('$') if nombre in arreglo[0]: print ("Nombre: " + arreglo[0] + " Teléfono: " + arreglo[1] + " Correo: " + arreglo[2]) print ("*******************************") Noencotrado = False if Noencotrado == True: print("Contacto no encontrado") def eliminarContacto(self): nombre = input("Inserta el nombre a eliminar: ") Noencontrado = True for elemento in self.lista: arreglo = elemento.split('$') if nombre in arreglo[0]: self.lista.remove(elemento) Noencontrado = False if Noencontrado == True: print("Contacto no encontrado") archivo = Archivo() archivo.iniciarArchivo() archivo.cargarAgenda() while True: os.system('cls') print("1.- Escribir contacto") print("2.- Lee contactos") print("3.- Buscar contacto") print("4.- Eliminar contacto") print("5.- salir contacto") try: opcion = int(input("Inserte la opción a elegir: ")) except: print("Opción no valida") os.system('pause') continue if opcion == 1: archivo.crearContacto() elif opcion == 2: archivo.imprimirContacto() elif opcion == 3: archivo.buscarContacto() 24 elif opcion == 4: archivo.eliminarContacto() elif opcion == 5: archivo.escribirArchivo() break else: print("Opción no valida") os.system('pause') Podrás observar que en la carpeta que tienes el proyecto se ha creado un archivo de texto llamada agenda.txt que almacena los datos para que no se pierdan cuando salimos del programa. 25