En el momento en que todo encaje, considere que el proyecto es divertido. Creé un proyecto CLI amigable para el cliente para comprender cómo funcionan una clase, métodos y propiedades.
La estructura de mi directorio era bastante simple:
└── biblioteca
├── modelos
│ ├── __init__.py
│ └── actor.py
| └── película.py
├── cli.py
├── depuración.py
└── ayudantes.py
├── Archivo Pip
├── Pipfile.bloqueo
├── LÉAME.md
Como puede ver en la estructura, construí una asociación de uno a muchos en la que un actor tiene muchas películas. De esta asociación entró en juego mi menú.
Mi menú anterior fue definido por una función llamada... menu() que estaba ubicada en mi archivo cli.py junto con main() que muestra al usuario el menú CLI:
def main(): while True: welcome() menu() choice = input("> ").strip() if choice == "1": actor_list() elif choice == "2": add_actor() elif choice == "3": delete_actor() elif choice == "4": exit_program() break else: print("Invalid choice. Try again.\n")
Esta función en particular fue la primera de muchas en las que se ejecutó un bucle while junto con declaraciones if/elif/else para brindarle a nuestro usuario la capacidad de navegar por nuestros menús con facilidad.
El cli.py luego concluye con algún bloque de código importante:
if __name__ == "__main__": main()
Este bloque de código le dice a nuestro intérprete (Python) que solo ejecute nuestro archivo si se llama desde la línea de comando.
También hubo funciones auxiliares involucradas en este proyecto que también utilizaron un bucle while junto con declaraciones if/elif/else. Uno en particular destaca por mostrar facilidad de navegación al seleccionar por ejemplo nuestra lista actual de actores:
def actor_list(): actor_list = Actor.get_all() if actor_list: print("\n*** UPDATED LIST! ***") for i, actor in enumerate(actor_list, start=1): print(f"{i}. {actor.name}") while True: choice = input("Press 'a' to add an actor\n" "Press 'b' for actor profile\n" "Press 'c' to return to the main menu.\n" "Press 'd' delete an actor.\n").lower() if choice == 'a': add_actor() break elif choice == 'b': actor_profile() break elif choice == 'c': return elif choice == 'd': delete_actor() break else: print("Invalid choice. Please try again.") else: print("List empty!") while True: choice = input("Press 'a' or to add an actor\n" "Press 'b' for main menu.\n").lower() if choice == 'a': add_actor() break elif choice == 'b': return else: print("Invalid choice. Please try again.")
Aquí no solo me acostumbré al bucle while y las declaraciones if, sino que también obtuve los beneficios de la apariencia y el orden usando enumerate() con un bucle for para iterar con un índice en Python permitiendo todas las listas a lo largo del proyecto. ser una lista ordenada.
Nuestros dos personajes principales, por supuesto, son el actor de clase y la película. Ambos constan de código similar en términos de métodos de clase al crear, actualizar o eliminar una instancia de esa clase en particular, pero existen diferencias:
Tomemos nuestra clase de Películas, por ejemplo:
class Movie: all_movies = {} def __init__(self, movie, genre, actor_id, id=None): self.id = id self.movie = movie self.genre = genre self.actor_id = actor_id
Dado que tenemos la configuración de nuestro proyecto donde un actor tiene muchas películas, nuestra clase de película tendrá un parámetro/atributo actor_id único para establecer un vínculo entre la instancia de la película y un actor específico, permitiendo una fácil referencia a la información del actor.
Ahora mira este bloque de código en nuestra clase Actor:
def movies(self): from models.movie import Movie sql = """ SELECT * FROM movie WHERE actor_id = ? """ CURSOR.execute(sql, (self.id,),) rows = CURSOR.fetchall() return [ Movie.instance_from_db(row) for row in rows ]
Aquí tenemos nuestro método movies() para recuperar todas las películas asociadas con la instancia de Actor actual consultando la tabla de películas usando el ID del actor. Esto luego devolverá una lista de objetos Película, estableciendo una relación "tiene muchos" entre Actor y Película.
Los bloques de código discutidos fueron las áreas principales del proyecto en las que me concentré en lograr una mayor comprensión. En general, este proyecto sirvió como un buen ejercicio para mejorar mis habilidades en Python.
Descargo de responsabilidad: Todos los recursos proporcionados provienen en parte de Internet. Si existe alguna infracción de sus derechos de autor u otros derechos e intereses, explique los motivos detallados y proporcione pruebas de los derechos de autor o derechos e intereses y luego envíelos al correo electrónico: [email protected]. Lo manejaremos por usted lo antes posible.
Copyright© 2022 湘ICP备2022001581号-3