Como crear un generador de curriculum en Python

1. Estructura del proyecto

2. models/curriculum_base -Clase.

3. models/templates.py — Plantillas heredadas (LinkedIn, Europass, Minimalista, Moderna).

4. app.py— Servidor Flask listo para desplegar.

5. HTML integrable en tu web (formulario + vista previa) HTML

(Ojo: en resumen faltaba paréntesis en oninput, mejor usar oninput="onFormChange()" como en el resto.)

6, JavaScript con autosave + vista previa en tiempo real (muy comentado)




Curso de Programación Orientada a Objetos






Curso de Programación Orientada a Objetos

Guía didáctica en 10 lecciones

por Daniel Caraballo

danielcaraballo.es

Índice

  1. Clases
  2. Objetos
  3. Atributos y métodos
  4. Abstracción
  5. Encapsulamiento
  6. Herencia
  7. Polimorfismo
  8. Clases abstractas
  9. Principios SOLID
  10. Patrones de diseño

1. Clases en Programación Orientada a Objetos

¿Qué es una clase?

Una clase es un molde o plantilla que define cómo serán los objetos.

Dentro de una clase se definen:

  • Atributos (datos)
  • Métodos (acciones)

Es como un plano que describe cómo construir algo.

Ejemplo de una clase en Python

class Persona:
    def __init__(self, nombre, edad):
        self.nombre = nombre      # Atributo
        self.edad = edad          # Atributo

    def saludar(self):            # Método
        return f"Hola, soy {self.nombre}"

2. Objetos en Programación Orientada a Objetos

¿Qué es un objeto?

Un objeto es una instancia de una clase.

Si la clase es un plano, el objeto es la casa construida con ese plano.

Características de un objeto

  • Atributos: datos propios del objeto.
  • Métodos: acciones que puede realizar.
  • Estado: cómo se encuentra en un momento dado.
  • Identidad: cada objeto es único en memoria.

Ejemplo de creación de objetos

class Persona:
    def __init__(self, nombre, edad):
        self.nombre = nombre
        self.edad = edad

# Creamos dos objetos distintos
persona1 = Persona("Ana", 30)
persona2 = Persona("Luis", 25)

print(persona1.nombre)  # Ana
print(persona2.nombre)  # Luis

3. Atributos y Métodos

¿Qué son los atributos?

Los atributos son las características o datos que tiene un objeto.

Por ejemplo, una persona puede tener:

  • nombre
  • edad
  • altura

Cada objeto tendrá sus propios valores para esos atributos.

¿Qué son los métodos?

Los métodos son las acciones que un objeto puede realizar.

Siguiendo el ejemplo de una persona:

  • saludar()
  • caminar()
  • hablar()

Los métodos son funciones que viven dentro de una clase.

Ejemplo de atributos y métodos en Python

class Coche:
    def __init__(self, marca, velocidad):
        self.marca = marca          # Atributo
        self.velocidad = velocidad  # Atributo

    def acelerar(self):             # Método
        self.velocidad += 10
        return f"Velocidad actual: {self.velocidad} km/h"

# Creamos un objeto
mi_coche = Coche("Toyota", 120)

print(mi_coche.acelerar())  # Velocidad actual: 130 km/h

4. Abstracción

¿Qué es la abstracción?

La abstracción consiste en centrarse solo en lo importante y ocultar los detalles innecesarios.

Es como usar un coche: no necesitas saber cómo funciona el motor, solo cómo conducirlo.

Ejemplo de abstracción en Python

class Cafetera:
    def __init__(self):
        self.agua = 100

    def hacer_cafe(self):
        # El usuario no ve estos detalles internos
        self.agua -= 10
        return "Café listo"

# El usuario solo usa el método, sin saber cómo funciona dentro
cafetera = Cafetera()
print(cafetera.hacer_cafe())

¿Por qué es útil la abstracción?

  • Crear código más simple de usar
  • Ocultar detalles complejos
  • Evitar errores del usuario
  • Reutilizar componentes sin conocer su interior

5. Encapsulamiento

¿Qué es el encapsulamiento?

El encapsulamiento consiste en proteger los datos internos de un objeto para evitar que sean modificados directamente desde fuera.

Es como una caja fuerte: solo se accede a ella mediante métodos.

Modificadores de acceso en Python

Python usa una convención:

  • atributo → público
  • _atributo → protegido
  • __atributo → privado

Ejemplo de encapsulamiento en Python

class CuentaBancaria:
    def __init__(self, saldo):
        self.__saldo = saldo   # Atributo privado

    def depositar(self, cantidad):
        self.__saldo += cantidad

    def obtener_saldo(self):
        return self.__saldo

cuenta = CuentaBancaria(100)
cuenta.depositar(50)
print(cuenta.obtener_saldo())  # 150

6. Herencia

¿Qué es la herencia?

La herencia permite crear nuevas clases basadas en clases existentes.

La clase hija hereda atributos y métodos de la clase padre.

Ventajas de la herencia

  • Reutilizar código
  • Evitar duplicación
  • Crear jerarquías lógicas
  • Extender funcionalidades fácilmente

Ejemplo de herencia en Python

class Animal:
    def __init__(self, nombre):
        self.nombre = nombre

    def hacer_sonido(self):
        return "Sonido genérico"

# Clase hija que hereda de Animal
class Perro(Animal):
    def hacer_sonido(self):
        return "Guau!"

mi_perro = Perro("Toby")
print(mi_perro.nombre)          # Toby
print(mi_perro.hacer_sonido())  # Guau!

7. Polimorfismo

¿Qué es el polimorfismo?

El polimorfismo permite que diferentes clases respondan al mismo método, pero cada una a su manera.

Por ejemplo:

  • Perro.hacer_sonido() → «Guau»
  • Gato.hacer_sonido() → «Miau»

Ventajas del polimorfismo

  • Escribir código más flexible
  • Reutilizar funciones que aceptan distintos tipos
  • Evitar condicionales innecesarios
  • Extender comportamientos sin modificar código existente

Ejemplo de polimorfismo en Python

class Animal:
    def hacer_sonido(self):
        return "Sonido genérico"

class Perro(Animal):
    def hacer_sonido(self):
        return "Guau!"

class Gato(Animal):
    def hacer_sonido(self):
        return "Miau!"

# Función que usa polimorfismo
def reproducir_sonido(animal):
    print(animal.hacer_sonido())

reproducir_sonido(Perro())  # Guau!
reproducir_sonido(Gato())   # Miau!

8. Clases Abstractas

¿Qué es una clase abstracta?

Una clase abstracta es una clase que no se puede instanciar directamente.

Sirve como modelo para otras clases y define métodos que las clases hijas deben implementar.

¿Para qué sirve una clase abstracta?

  • Definir una estructura común
  • Obligar a las clases hijas a implementar ciertos métodos
  • Evitar instanciar clases incompletas
  • Organizar jerarquías más claras

Ejemplo de clase abstracta en Python

from abc import ABC, abstractmethod

# Clase abstracta
class Animal(ABC):

    @abstractmethod
    def hacer_sonido(self):
        pass

# Clase hija que implementa el método abstracto
class Perro(Animal):
    def hacer_sonido(self):
        return "Guau!"

mi_perro = Perro()
print(mi_perro.hacer_sonido())  # Guau!

9. Principios SOLID

¿Qué es SOLID?

SOLID es un conjunto de 5 principios que ayudan a escribir código más limpio, mantenible y escalable.

  • S — Single Responsibility Principle
  • O — Open/Closed Principle
  • L — Liskov Substitution Principle
  • I — Interface Segregation Principle
  • D — Dependency Inversion Principle

S — Principio de Responsabilidad Única

Una clase debe tener una sola razón para cambiar.

O — Principio Abierto/Cerrado

Una clase debe estar abierta a extensión y cerrada a modificación.

L — Principio de Sustitución de Liskov

Una clase hija debe poder sustituir a su clase padre sin romper el programa.

I — Principio de Segregación de Interfaces

Es mejor tener muchas interfaces pequeñas que una grande.

D — Principio de Inversión de Dependencias

Las clases deben depender de abstracciones, no de implementaciones concretas.

Ejemplo simple de SOLID en Python

# Ejemplo del principio S (Responsabilidad Única)

class Reporte:
    def generar(self):
        return "Datos del reporte"

class ReportePrinter:
    def imprimir(self, reporte):
        print(reporte.generar())

printer = ReportePrinter()
printer.imprimir(Reporte())

10. Patrones de Diseño

¿Qué son los patrones de diseño?

Los patrones de diseño son soluciones reutilizables a problemas comunes en el desarrollo de software.

No son código exacto, sino modelos que puedes adaptar.

Se dividen en:

  • Creacionales — cómo crear objetos
  • Estructurales — cómo organizar clases
  • Comportamiento — cómo interactúan los objetos

Patrones Creacionales

  • Singleton — solo una instancia
  • Factory Method — crea objetos sin especificar la clase exacta
  • Builder — construye objetos paso a paso
# Ejemplo simple de Singleton en Python

class Config:
    _instancia = None

    def __new__(cls):
        if cls._instancia is None:
            cls._instancia = super().__new__(cls)
        return cls._instancia

c1 = Config()
c2 = Config()

print(c1 is c2)  # True

Patrones Estructurales

  • Adapter — adapta una interfaz a otra
  • Decorator — añade funcionalidades sin modificar la clase
  • Facade — simplifica sistemas complejos
# Ejemplo simple de Decorator

def mayusculas(func):
    def wrapper():
        return func().upper()
    return wrapper

@mayusculas
def saludar():
    return "hola"

print(saludar())  # HOLA

Patrones de Comportamiento

  • Observer — notifica cambios a múltiples objetos
  • Strategy — intercambia algoritmos fácilmente
  • Command — encapsula acciones como objetos
# Ejemplo simple de Strategy

class EstrategiaA:
    def ejecutar(self):
        return "Estrategia A"

class EstrategiaB:
    def ejecutar(self):
        return "Estrategia B"

class Contexto:
    def __init__(self, estrategia):
        self.estrategia = estrategia

    def operar(self):
        return self.estrategia.ejecutar()

ctx = Contexto(EstrategiaA())
print(ctx.operar())  # Estrategia A





🖥️ Cómo ejecutar archivos .exe y .py desde Python sin bloquear tu programa

Un módulo práctico para automatizar tareas en Windows

Cuando trabajamos con Python en entornos Windows, tarde o temprano surge una necesidad muy común: lanzar programas externos desde nuestro script. Puede ser un instalador, una herramienta auxiliar, un script .py o cualquier .exe que forme parte de tu flujo de trabajo.

Python ofrece varias formas de hacerlo, pero una de las más flexibles y potentes es el uso del módulo subprocess. En este artículo exploramos un módulo real —EjecutaExe— que encapsula esta funcionalidad y permite ejecutar archivos en segundo plano, sin bloquear la ejecución del programa principal.

Vamos paso a paso.


🔧 ¿Qué hace exactamente este módulo?

El módulo define una clase llamada EjecutaExe, cuyo propósito es muy concreto:

Lanzar un archivo .exe o .py desde Python sin detener el flujo del programa.

Esto es especialmente útil cuando quieres:

  • Ejecutar varios archivos uno tras otro sin reiniciar tu script.
  • Lanzar procesos externos mientras tu programa sigue funcionando.
  • Automatizar tareas repetitivas desde una interfaz en consola.
  • Crear herramientas de administración o utilidades internas.

🧩 1. Entendiendo la base: subprocess

El corazón del módulo es el uso de:

import subprocess

Este módulo permite a Python comunicarse con programas externos como si los ejecutaras desde la terminal o desde el Explorador de Windows.

Pero la estrella del show es:

subprocess.Popen([...])

🚀 ¿Qué hace Popen?

  • Lanza el programa inmediatamente.
  • No espera a que termine.
  • Devuelve un objeto de proceso, que puedes consultar o controlar.

Esto significa que tu script no se queda congelado esperando a que el .exe termine. El proceso corre en paralelo, como un hilo independiente.

¿Qué puedes hacer con el objeto proceso?

Si no necesitas controlarlo, simplemente lo ignoras y listo.


🧵 2. ¿Qué significa “ejecutar en segundo plano”?

Cuando usas Popen, Python no se detiene. Continúa ejecutando el resto del código mientras el archivo externo hace su trabajo.

Si hubieras usado:

subprocess.run()

entonces sí tendrías que esperar a que el programa terminara antes de seguir.

Por eso Popen es ideal para automatización, utilidades y herramientas interactivas.


🧪 3. El ejemplo práctico del módulo

El módulo incluye un ejemplo muy didáctico: un bucle infinito que permite ejecutar varios archivos sin reiniciar el programa.

El usuario escribe la ruta del archivo, y Python lo lanza en segundo plano:

proceso = subprocess.Popen(["python", archivo])

Esto garantiza compatibilidad incluso si el sistema no tiene asociado .py con Python.

Luego:

  • Se espera 2 segundos para que el proceso arranque.
  • Se comprueba si sigue activo con poll().
  • Se muestra un mensaje claro al usuario.
  • Se usa system("pause") y system("cls") para mantener la consola limpia y ordenada.

Si el archivo no existe, se captura el error:

except FileNotFoundError:
    print("No se encontró el archivo. Si no está en el PATH, escribe la ruta completa.")

Una solución elegante y muy útil para principiantes.


🧱 4. La clase completa: modularidad y claridad

El módulo organiza la explicación y el ejemplo dentro de la clase EjecutaExe, lo que permite:

  • Reutilizar el código en otros proyectos.
  • Integrarlo en menús, GUIs o herramientas más grandes.
  • Mantener una estructura limpia y escalable.

Además, incluye cadenas de documentación (self.definicion y self.ejemplo) que explican paso a paso cómo funciona todo, lo cual es perfecto para fines educativos.


🎯 5. ¿Para qué puedo usar este módulo?

Las posibilidades son amplias:

  • Lanzar scripts auxiliares desde un menú principal.
  • Crear instaladores o lanzadores personalizados.
  • Automatizar tareas repetitivas en Windows.
  • Ejecutar herramientas externas desde una interfaz Tkinter.
  • Integrar procesos paralelos en proyectos más grandes.

Si trabajas con Python en Windows, este módulo es una pieza muy útil para tu caja de herramientas.


🧠 Conclusión

El módulo EjecutaExe demuestra cómo Python puede interactuar con el sistema operativo de forma sencilla y potente. Gracias a subprocess.Popen, puedes lanzar programas externos sin bloquear tu script, lo que abre la puerta a automatizaciones, utilidades y flujos de trabajo más profesionales.

Es un ejemplo perfecto de cómo un pequeño módulo bien diseñado puede resolver un problema real de forma elegante y didáctica.




Crea una ventana de Tkinter con varios botones.


🟦 ¿Qué hace este código?

Crea una ventana de Tkinter con varios botones.
Cada botón hace algo distinto: abrir una web, llamar a una clase, o cerrar la ventana.

Además, dentro de la clase MenuApp se crean todas las herramientas que usarás en tu menú (Variables, Listas, Colores, etc.).


🟦 Explicación clara del código

1. Importaciones

import tkinter as tk
import webbrowser

  • tkinter → sirve para crear ventanas y botones.
  • webbrowser → sirve para abrir páginas web.

2. Importas tus clases

from ClassMenu import Menus
from ClassVariables import Variables
...

Estas son tus clases personalizadas.
Las usarás cuando el usuario pulse un botón.


3. Creas la clase principal del menú

class MenuApp:

Esta clase contiene todo el menú.


4. Constructor __init__

def __init__(self, root):

  • root es la ventana principal.
  • Aquí configuras la ventana y creas los botones.

5. Configuración de la ventana

self.root = root
self.root.configure(bg="#1e1e1e")
self.root.title(" Programación es Python ")

  • Guardas la ventana en self.root.
  • Le pones un color de fondo.
  • Le pones un título.

6. Creas las instancias de tus clases

self.menu1 = Variables()
self.app = AppColores()
self.numerobinario = DecimalBinario()
...

Esto significa:

👉 “Voy a usar estas clases dentro del menú, así que las preparo aquí”.


7. BOTÓN 1 → Variables

boton_variables = tk.Button(
    root,
    text="VARIABLES",
    ...
    command=lambda: (
        self.menu1.variables(),
        webbrowser.open_new_tab("https://danielcaraballo.es/variables-en-python/")
    )
)
boton_variables.pack(pady=5)

¿Qué hace este botón?

  1. Llama al método variables() de tu clase Variables.
  2. Abre tu página web sobre variables.

Todo eso ocurre al pulsarlo.


8. BOTÓN 2 → f-format

boton_format = tk.Button(
    root,
    text="f- Format",
    ...
    command=lambda: webbrowser.open_new_tab("https://danielcaraballo.es/f-f-format-de-un-strings/")
)
boton_format.pack(pady=10)

Este botón solo abre una web.


9. BOTÓN 3 → Listas

boton_listas = tk.Button(
    root,
    text="Listas",
    ...
    command=lambda: webbrowser.open_new_tab("https://danielcaraballo.es/las-listas-en-python/")
)
boton_listas.pack(pady=10)

Abre tu página sobre listas.


10. BOTÓN 4 → Instalación

boton_instalacion = tk.Button(
    root,
    text="Instalación y IDE de trabajo",
    ...
    command=lambda: webbrowser.open_new_tab("https://danielcaraballo.es/lenguaje-de-programacion-python/")
)
boton_instalacion.pack(pady=10)

Abre tu página sobre instalación de Python.


11. BOTÓN 5 → Cerrar menú

boton_volver = tk.Button(
    root,
    text="Menu anterior",
    ...
    command=root.destroy
)
boton_volver.pack(pady=10)

Este botón cierra la ventana.


12. Método para iniciar el menú

@staticmethod
def iniciar_menu():
    root = tk.Tk()
    root.geometry("300x300+900+20")
    MenuApp(root)
    root.mainloop()

Esto:

  • Crea la ventana.
  • Le da tamaño y posición.
  • Crea el menú dentro de la ventana.
  • Mantiene la ventana abierta.

🟦 Resumen súper fácil

Tu código:

  • Crea una ventana.
  • Crea varios botones.
  • Cada botón abre una web o llama a una clase.
  • El último botón cierra la ventana.
  • Todo está organizado dentro de una clase llamada MenuApp.




🧭 Mini‑proyecto en Python: Menús interactivos con Programación Orientada a Objetos

En este artículo te presento un pequeño proyecto en Python que demuestra, de forma sencilla y práctica, cómo aplicar Programación Orientada a Objetos (POO) para crear un menú interactivo en consola.
El objetivo es que el usuario pueda navegar por distintas categorías del blog y abrir artículos directamente en su navegador.
Es un ejemplo ideal para aprender:

  • Cómo organizar código en clases
  • Cómo crear objetos y métodos
  • Cómo encapsular comportamientos
  • Cómo usar diccionarios para mapear opciones
  • Cómo interactuar con el sistema y el navegador
    Vamos paso a paso.

🧱 ¿Por qué este proyecto es POO?
La Programación Orientada a Objetos se basa en cuatro pilares fundamentales:

  1. Clases
  2. Objetos
  3. Métodos
  4. Encapsulación
    Este proyecto utiliza los cuatro de forma clara y didáctica.

🏗️ 1. Clases: la estructura del programa
El proyecto tiene dos clases principales:

Es la clase encargada de mostrar todos los menús y ejecutar las acciones correspondientes.
Dentro de ella viven métodos como:

  • Cada método representa una pantalla o acción del programa.

    Es la clase que contiene el punto de entrada del programa.
    Su método es el encargado de:
  • Crear un objeto
  • Mostrar el menú principal
  • Leer la opción del usuario
  • Llamar al menú correspondiente

🧩 2. Objetos: instancias que ejecutan acciones
En se crea un objeto:

Ese objeto es el que:

  • Muestra los menús
  • Abre enlaces
  • Gestiona la interacción
    En POO, un objeto es una instancia de una clase, y este proyecto lo utiliza exactamente como debe ser.

🛠️ 3. Métodos: comportamientos del objeto
Cada menú es un método dentro de la clase .
Por ejemplo:

  • abre artículos según el lenguaje elegido
  • abre la categoría de cocina
  • abre la sección de historia
    En POO, los métodos representan acciones que un objeto puede realizar.
    Aquí se ve de forma muy clara.

🔒 4. Encapsulación: organización y claridad
Aunque este proyecto no usa atributos privados, sí encapsula comportamientos dentro de clases.
Esto significa:

  • El código está organizado
  • Cada clase tiene una responsabilidad clara
  • No hay funciones sueltas
  • Todo está agrupado de forma lógica
    Es exactamente lo que busca la POO:
    👉 orden, modularidad y claridad.

📁 Estructura del proyecto

🧠 ¿Qué hace cada archivo?
📌
Contiene la clase , que agrupa todos los menús y acciones.
Es el “cerebro visual” del programa.

  • Muestra el menú principal
  • Permite elegir lenguajes de programación
  • Abre categorías del blog
  • Usa diccionarios para mapear opciones
  • Usa para abrir enlaces
  • Usa para no bloquear la ejecución

📌
Contiene la clase y el método .

  • Crea un objeto
  • Muestra el menú principal
  • Lee la opción del usuario
  • Valida la entrada
  • Llama al menú correspondiente
  • Abre el blog al salir
    Además, utiliza para indicar que no necesita una instancia de la clase.

🎯 Conclusión
Este proyecto es un ejemplo perfecto de Programación Orientada a Objetos aplicada a un caso real:

  • Las clases organizan el código
  • Los objetos ejecutan acciones
  • Los métodos representan comportamientos
  • La encapsulación mantiene todo limpio y modular
    Es sencillo, práctico y útil, ideal para quienes están aprendiendo Python y quieren ver cómo se aplica la POO en un proyecto real.

📝 Nota final del artículo

Crea todo el proyecto dentro de la misma carpeta.
Si colocas los archivos en directorios distintos o cambias su ubicación sin ajustar las rutas, el proyecto no funcionará correctamente.




🧾 Cómo crear un Registro de Personal en Python con JSON (guía didáctica y visual)

La estructura está pensada para que el lector aprenda, disfrute y pueda copiar el código sin miedo.
Aquí la tienes 👇

🧾 Cómo crear un Registro de Personal en Python con JSON (guía didáctica y visual)
En este artículo vamos a construir un pequeño sistema para registrar personas, guardar sus datos en un archivo JSON y buscar empleados por cargo.
Todo desde consola, paso a paso, con código limpio y explicaciones claras.
Ideal para quienes están aprendiendo Python y quieren practicar clases, archivos, JSON y bucles.

🎯 Objetivo del proyecto
Vamos a crear un programa que permita:

  • Registrar personas (nombre, edad, sexo, cargo).
  • Guardarlas en un archivo sin borrar lo anterior.
  • Mostrar los datos guardados.
  • Buscar personas por cargo.
  • Mantener un formato bonito y legible.

🧱 1. La clase
Comenzamos creando una clase que represente a cada persona:

Esta clase nos permite trabajar con objetos, pero también convertirlos a diccionarios para guardarlos en JSON.

📦 2. Guardar datos en un archivo JSON
Creamos una función que:

  1. Carga el archivo si existe.
  2. Si no existe, crea una lista vacía.
  3. Agrega la nueva persona.
  4. Guarda todo con formato bonito.

📝 3. Registrar una persona
Pedimos los datos por consola, creamos el objeto y lo guardamos:

🔍 4. Buscar personas por cargo
Ahora viene la parte interactiva: un pequeño menú para buscar empleados por cargo.

📁 5. ¿Cómo queda el archivo ?
Después de registrar varias personas, el archivo se verá así:

Cada nueva persona se agrega al final sin borrar lo anterior.

🎨 6. Explicación visual (tu toque didáctico)
Imagina el archivo JSON como una estantería de fichas:

Cada vez que registras una persona, simplemente añades una ficha más.
Y cuando buscas por cargo, el programa revisa cada ficha como si dijera:

Hasta encontrar coincidencias.

🧠 7. Qué aprende el lector con este proyecto

  • Uso de clases en Python.
  • Conversión de objetos a diccionarios.
  • Lectura y escritura de archivos JSON.
  • Manejo de errores.
  • Búsquedas dentro de listas.
  • Interacción por consola.
  • Persistencia de datos.
    Un proyecto perfecto para principiantes que quieren dar un salto hacia programas más útiles y reales.

1. Importaciones

import json

import os from os

import system

¿Qué hace cada una?

  • json → permite leer y escribir archivos JSON.
  • os → permite comprobar si un archivo existe.
  • system → permite ejecutar comandos del sistema como pause o cls.

🧱 2. Clase Personal

class Personal: def __init__(self, nombre, edad, sexo, cargo): self.nombre = nombre self.edad = edad self.sexo = sexo self.cargo = cargo

¿Qué es esto?

Es un molde para crear personas.
Cada persona tendrá:

  • nombre
  • edad
  • sexo
  • cargo

📌 Método para mostrar información

def mostrar_informacion(self):

print(f»Nombre: {self.nombre}»)

print(f»Edad: {self.edad}»)

print(f»Sexo: {self.sexo}»)

print(f»Cargo: {self.cargo}»)

Muestra los datos en pantalla de forma ordenada.

📌 Método para convertir a diccionario

def convertir_a_diccionario(self):

return { «nombre»: self.nombre, «edad»: self.edad, «sexo»: self.sexo, «cargo»: self.cargo }

Esto es necesario porque JSON no puede guardar objetos, pero sí diccionarios.

📦 3. Función para guardar en JSON

def guardar_en_json(persona_dict):

archivo = «personal.json»

if os.path.exists(archivo):

with open(archivo, «r», encoding=»utf-8″) as f: datos = json.load(f)

else: datos = [] datos.append(persona_dict)

with open(archivo, «w», encoding=»utf-8″) as f: json.dump(datos, f, indent=4, ensure_ascii=False)

¿Qué hace?

  1. Comprueba si el archivo existe

    • Si existe → lo abre y carga su contenido.
    • Si no existe → crea una lista vacía.

  2. Agrega la nueva persona a la lista.
  3. Vuelve a guardar todo en el archivo JSON.

¿Por qué funciona tan bien?

Porque no borra lo anterior, solo añade.

🧑‍💻 4. Programa principal: registrar una persona

print(«—–Registro de Personal—–\n»)

nombre = input(«Ingrese el nombre: «)

edad = input(«Ingrese la edad: «)

sexo = input(«Ingrese el sexo: «)

cargo = input(«Ingrese el cargo: «)

Pide los datos al usuario.

📌 Crear el objeto

persona = Personal(nombre, edad, sexo, cargo)

Aquí se crea una persona real usando la clase.

📌 Mostrar y guardar

persona.mostrar_informacion() guardar_en_json(persona.convertir_a_diccionario())

  • Muestra los datos en pantalla.
  • Convierte la persona a diccionario.
  • La guarda en el archivo JSON.

📁 5. Leer el archivo JSON

with open(«personal.json», «r», encoding=»utf-8″) as archivo: datos = json.load(archivo)

Carga todas las personas registradas en una lista llamada datos.

🔍 6. Búsqueda por cargo

while True: print(«\n Estas en buscar a una persona por cargo \n»)

cargo_buscar = input(«Ingrese el cargo a buscar (o ‘salir’ para terminar): «) 

Bucle infinito hasta que el usuario escriba salir.

📌 Buscar coincidencias

encontrado = False for persona in datos:

if persona[«cargo»].lower() == cargo_buscar.lower():

print(«Persona encontrada:»)

print(json.dumps(persona, indent=4, ensure_ascii=False)) encontrado = True break

¿Qué hace?

  • Recorre todas las personas del JSON.
  • Compara el cargo ignorando mayúsculas/minúsculas.
  • Si encuentra una coincidencia:

  • La imprime en formato bonito.
  • Marca encontrado = True.
  • Sale del bucle.

📌 Si no encuentra nada

if not encontrado: print(«Cargo no encontrada.»)

📌 Pausa y limpiar pantalla

system(«pause»)

system(«cls»)

  • pause → espera que el usuario presione una tecla.
  • cls → limpia la pantalla (solo Windows).

🎯 Resumen visual del flujo

[Usuario escribe datos]

↓ [Se crea un objeto Personal]

↓ [Se convierte a diccionario]

↓ [Se guarda en personal.json]

↓ [Se cargan todos los registros]

↓ [Usuario busca por cargo]

↓ [Se muestran coincidencias]




Poo en Python muy sencillo

Código completo (para referencia)

class Animal:
    def __init__(self, nombre):
        self.nombre = nombre

    def hablar(self):
        return "Sonido genérico"
class Perro(Animal):
    def hablar(self):
        return "Guau!"
class Gato(Animal):
    def hablar(self):
        return "Miau!"
animales = [Perro("Firulais"), Gato("Misu")]

for animal in animales:
    print(f"{animal.nombre} dice: {animal.hablar()}")

Primera parte: clase Animal

class Animal:

  • class Animal:
    Declara una nueva clase llamada Animal.
    Una clase es un “molde” o “plantilla” para crear objetos del tipo Animal.
    def __init__(self, nombre):

  • def __init__(self, nombre):
    Define el método especial __init__, que es el constructor.
    Se ejecuta automáticamente cuando creas un Animal.

    • self representa al propio objeto.
    • nombre es un parámetro que recibirá el nombre del animal.

        self.nombre = nombre

  • self.nombre = nombre
    Crea un atributo llamado nombre dentro del objeto.
    Guarda en self.nombre el valor que se pasa al crear el animal.
    Es decir, el objeto recordará su nombre.
    def hablar(self):

  • def hablar(self):
    Declara un método llamado hablar para la clase Animal.
    Este será el comportamiento “genérico” de hablar.
        return "Sonido genérico"

  • return "Sonido genérico"
    Cuando se llame a hablar() en un Animal, devolverá esta cadena.
    Más adelante, las clases hijas lo cambiarán por sonidos más específicos.

Segunda parte: clase Perro que hereda de Animal

class Perro(Animal):

  • class Perro(Animal):
    Crea una clase Perro que hereda de Animal.
    Eso significa que Perro tiene todo lo de Animal (como nombre), pero puede añadir o cambiar cosas.
    def hablar(self):

  • def hablar(self):
    Define el método hablar en Perro.
    Este método sobrescribe (reemplaza) el hablar genérico de Animal.
        return "Guau!"

  • return "Guau!"
    Cuando se llame a hablar() en un Perro, devolverá "Guau!".

Tercera parte: clase Gato que también hereda de Animal

class Gato(Animal):

  • class Gato(Animal):
    Declara la clase Gato que también hereda de Animal.
    Igual que Perro, tiene nombre y puede hablar.
    def hablar(self):

  • def hablar(self):
    Sobrescribe el método hablar para los gatos.
        return "Miau!"

  • return "Miau!"
    Cuando se llame a hablar() en un Gato, devolverá "Miau!".

Cuarta parte: creando objetos y usando polimorfismo

animales = [Perro("Firulais"), Gato("Misu")]

  • animales = [...]
    Crea una lista llamada animales.
  • Perro("Firulais")
    Crea un objeto de tipo Perro con nombre = "Firulais".
    Internamente llama a __init__ de Animal y guarda ese nombre.
  • Gato("Misu")
    Crea un objeto de tipo Gato con nombre = "Misu".
    También usa el constructor heredado.
  • La lista contiene ahora dos objetos: un perro y un gato.
for animal in animales:

  • for animal in animales:
    Inicia un bucle que recorre cada elemento de la lista animales.
    En cada vuelta, la variable animal será:

    • Primero, el Perro("Firulais")
    • Después, el Gato("Misu")

    print(f"{animal.nombre} dice: {animal.hablar()}")

  • print(f"{animal.nombre} dice: {animal.hablar()}")
    Usa una f-string para formatear el texto.

  • Aquí es donde aparece el polimorfismo:

    • Si animal es un Perro, hablar() devuelve "Guau!".
    • Si animal es un Gato, hablar() devuelve "Miau!".

  • En pantalla verás:

    • Firulais dice: Guau!
    • Misu dice: Miau!




Modulos y paquetes en Python

  • Los módulos son archivos que almacenan datos, clases y variables para ser utilizados según sea necesario en el programa.

Para importar un módulo, archivo o clase en Python, utilizamos la palabra reservada ‘import’ seguida del nombre del módulo que deseamos importar. La sintaxis correcta sería:

  • from nombre archivo import nombre clase

Los módulos deben ubicarse en el mismo directorio donde se está desarrollando la aplicación.

  • Los paquetes se utilizan cuando el código es extenso. Para organizar mejor el trabajo, creamos directorios que contienen archivos relacionados entre sí, generalmente pertenecientes a la misma categoría.

El método para hacerlo sería:

  • from nombre carpeta . nombre archivo impor clase o funcion que queremos

Se deve de poner en las carpetas un archivo vacio con el nombre de __init__.py




La herencia simple y multiple en Python permite crear una clase derivada que hereda atributos y métodos de una única clase base.

Para heredar de una clase a otra, pasamos la clase que queremos aprovechar entre paréntesis. Veamos este ejemplo:

La herencia múltiple es similar a la simple, pero involucra a dos elementos, como se muestra en este ejemplo:




Que es un constructor

Un constructor en Python es un método especial que se ejecuta automáticamente cuando creas un objeto a partir de una clase.

Su función es inicializar ese objeto: preparar sus atributos, validar datos iniciales o ejecutar cualquier configuración necesaria.

El constructor se llama __init__.

Los constructores se utilizan para crear instancias sobre los objetos de una clase.

Su funcion es asignar valor a los elementos de una clase, se asigna con la instuccion def __init__(self)

Self se utiliza dentro de todas las clases.

Qué es self en Python

self es una referencia al propio objeto que se está creando o usando.
Es decir, dentro de una clase, self te permite acceder a:

  • Sus atributos
  • Sus métodos
  • Su estado interno

No es una palabra reservada; podrías llamarlo de otra forma, pero usar self es la convención universal en Python.

Ejemplo de codigo: