""
Mostrando las entradas con la etiqueta POO. Mostrar todas las entradas
Mostrando las entradas con la etiqueta POO. Mostrar todas las entradas

domingo, 26 de abril de 2026

Python II. 3.2.1 POO que es una pila y el enfoque procedimental

 3.2.1 ¿Qué es una pila?

Una pila es una estructura desarrollada para almacenar datos de una manera muy específica. Imagina una pila de monedas. No puedes poner una moneda en ningún otro lugar sino en la parte superior de la pila.

Del mismo modo, no puedes sacar una moneda de la pila desde ningún lugar que no sea la parte superior de la pila. Si deseas obtener la moneda que se encuentra en la parte inferior, debes eliminar todas las monedas de los niveles superiores.

El nombre alternativo para una pila (pero solo en la terminología de TI) es UEPS (LIFO son sus siglas en inglés).

Es una abreviatura para una descripción muy clara del comportamiento de la pila: Último en Entrar - Primero en Salir (Last In - First Out). La moneda que quedó en último lugar en la pila saldrá primero.. La moneda que llegó en último lugar a la pila se irá primero.

 


Una pila es un objeto con dos operaciones elementales, denominadas convencionalmente push (cuando un nuevo elemento se coloca en la parte superior) y pop (cuando un elemento existente se retira de la parte superior).

Las pilas se usan muy a menudo en muchos algoritmos clásicos, y es difícil imaginar la implementación de muchas herramientas ampliamente utilizadas sin el uso de pilas.

Implementemos una pila en Python. Esta será una pila muy simple, y te mostraremos como hacerlo en dos enfoques independientes: de manera procedimental y de orientado a objetos.

Comencemos con el primero.

3.2.2 La pila: el enfoque procedimental

Primero, debes decidir como almacenar los valores que llegarán a la pila. Sugerimos utilizar el método más simple, y emplear una lista para esta tarea. Supongamos que el tamaño de la pila no está limitado de ninguna manera. Supongamos también que el último elemento de la lista almacena el elemento superior.

La pila en sí ya está creada:

>>stack = []

Estamos listos para definir una función que coloca un valor en la pila. Aquí están las presuposiciones para ello:

  • El nombre para la función es push.
  • La función obtiene un parámetro (este es el valor que se debe colocar en la pila).
  • La función no retorna nada.
  • La función agrega el valor del parámetro al final de la pila.

Así es como lo hemos hecho, echa un vistazo:

>>def push(val):

>>    stack.append(val)

Ahora es tiempo de que una función quite un valor de la pila. Así es como puedes hacerlo:

  • El nombre de la función es pop.
  • La función no obtiene ningún parámetro.
  • La función devuelve el valor tomado de la pila.
  • La función lee el valor de la parte superior de la pila y lo elimina.

La función esta aquí:

>>def pop():

>>    val = stack[-1]

>>    del stack[-1]

>>    return val

Nota: la función no verifica si hay algún elemento en la pila.

Armemos todas las piezas juntas para poner la pila en movimiento. El programa completo empuja (push) tres números a la pila, los saca e imprime sus valores en pantalla. Puedes verlo en la ventana del editor.

>>stack = []

>>def push(val):

>>    stack.append(val)

>>def pop():

>>    val = stack[-1]

>>    del stack[-1]

>>    return val


>>push(3)

>>push(2)

>>push(1)

>>print(pop())

>>print(pop())

>>print(pop())

>>>

1    

2

3

Python II. POO 3.1.9 Resumen de sección y 3.1.10 Cuestionario de sección

 Fuente: Cisco & Python Institute


3.1.9 RESUMEN DE SECCIÓN

1. Una clase es una idea (más o menos abstracta) que se puede utilizar para crear varias encarnaciones; una encarnación de este tipo se denomina objeto.

2. Cuando una clase se deriva de otra clase, su relación se denomina herencia. La clase que deriva de la otra clase se denomina subclase. El segundo lado de esta relación se denomina superclase. Una forma de presentar dicha relación es en un diagrama de herencia, donde:

Las superclases siempre se presentan encima de sus subclases.

Las relaciones entre clases se muestran como flechas dirigidas desde la subclase hacia su superclase.

3. Los objetos están equipados con:

  • Un nombre que los identifica y nos permite distinguirlos.
  • Un conjunto de propiedades (el conjunto puede estar vacío).
  • Un conjunto de métodos (también puede estar vacío).

4. Para definir una clase de Python, se necesita usar la palabra clave reservada class. Por ejemplo:

>>class This_Is_A_Class:

>>    pass

5. Para crear un objeto de la clase previamente definida, se necesita usar la clase como si fuera una función. Por ejemplo:

>>this_is_an_object = This_Is_A_Class()


3.1.10 CUESTIONARIO DE SECCIÓN

Pregunta 1: Si asumimos que pitones, víboras y cobras son subclases de la misma superclase, ¿cómo la llamarías?

Respuesta 1:

Serpiente, reptil, vertebrado, animal: todas estas respuestas son aceptables.


Pregunta 2: Intenta nombrar algunas subclases de las clase Pitón.

Respuesta 2:

Pitón india, Pitón de Roca Africana, Pitón Bola, Pitón Birmana: la lista es larga.


Pregunta 3: ¿Puedes usar la palabra "class" para darle nombre a alguna de tus clases?

Respuesta 3:

¡No, no puedes, class es una palabra clave reservada!

Python II. POO, clases, objetos

 3.1.7 Tu primera clase

La programación orientada a objetos es el arte de definir y expandir clases. Una clase es un modelo de una parte muy específica de la realidad, que refleja las propiedades y actividades que se encuentran en el mundo real.

Las clases definidas al principio son demasiado generales e imprecisas para cubrir el mayor número posible de casos reales.

No hay obstáculo para definir nuevas subclases más precisas. Heredarán todo de su superclase, por lo que el trabajo que se utilizó para su creación no se desperdicia.

La nueva clase puede agregar nuevas propiedades y nuevas actividades y, por lo tanto, puede ser más útil en aplicaciones específicas. Obviamente, se puede usar como una superclase para cualquier número de subclases recién creadas.

El proceso no necesita tener un final. Puedes crear tantas clases como necesites.

La clase que se define no tiene nada que ver con el objeto: la existencia de una clase no significa que ninguno de los objetos compatibles se creará automáticamente. La clase en sí misma no puede crear un objeto: debes crearlo tu mismo y Python te permite hacerlo.

Es hora de definir la clase más simple y crear un objeto. Analiza el siguiente ejemplo:

>>class TheSimplestClass:

>>    pass

Hemos definido una clase. La clase es bastante pobre: no contiene propiedades ni actividades. Esta vacía, pero eso no importa por ahora. Cuanto más simple sea la clase, mejor para nuestros propósitos.

La definición comienza con la palabra clave reservada class. La palabra clave reservada es seguida por un identificador que le dará nombre a la clase (nota: no lo confundas con el nombre del objeto: estas son dos cosas diferentes).

A continuación, se agregan dos puntos (:), como clases, como funciones, forman su propio bloque anidado. El contenido dentro del bloque define todas las propiedades y actividades de la clase.

La palabra clave reservada pass llena la clase con nada. No contiene ningún método ni propiedades.

3.1.8 Tu primer objeto

La clase recién definida se convierte en una herramienta que puede crear nuevos objetos. La herramienta debe usarse explícitamente, bajo demanda.

Imagina que deseas crear un objeto (exactamente uno) de la clase TheSimplestClass.

Para hacer esto, debes asignar una variable para almacenar el objeto recién creado de esa clase y crear un objeto al mismo tiempo.

Se hace de la siguiente manera:

>>my_first_object = TheSimplestClass()

Nota:

El nombre de la clase intenta fingir que es una función, ¿puedes ver esto? Lo discutiremos pronto.

El objeto recién creado está equipado con todo lo que trae la clase. Como esta clase está completamente vacía, el objeto también está vacío.

El acto de crear un objeto de la clase seleccionada también se llama instanciación (ya que el objeto se convierte en una instancia de la clase).

Dejemos las clases en paz por un breve momento, ya que ahora diremos algunas palabras sobre pilas. Sabemos que el concepto de clases y objetos puede no estar completamente claro todavía. No te preocupes, te explicaremos todo muy pronto.

Python II. POO, Objetos y herencias

 3.1.4 ¿Qué es un objeto?

Una clase (entre otras definiciones) es un conjunto de objetos. Un objeto es un ser perteneciente a una clase.

Un objeto es una encarnación de los requisitos, rasgos y cualidades asignados a una clase específica. Esto puede sonar simple, pero ten en cuenta las siguientes circunstancias importantes. Las clases forman una jerarquía.

Esto puede significar que un objeto que pertenece a una clase específica pertenece a todas las superclases al mismo tiempo. También puede significar que cualquier objeto perteneciente a una superclase puede no pertenecer a ninguna de sus subclases.

Por ejemplo: cualquier automóvil personal es un objeto que pertenece a la clase Vehículos Terrestres. También significa que el mismo automóvil pertenece a todas las superclases de su clase local; por lo tanto, también es miembro de la clase Vehículos.

Tu perro (o tu gato) es un objeto incluido en la clase Mamíferos Domesticados, lo que significa explícitamente que también está incluido en la clase Animales.

Cada subclase es más especializada (o más específica) que su superclase. Por el contrario, cada superclase es más general (más abstracta) que cualquiera de sus subclases.

Ten en cuenta que hemos supuesto que una clase solo puede tener una superclase; esto no siempre es cierto, pero discutiremos este tema más adelante.

3.1.5 Herencia

Definamos uno de los conceptos fundamentales de la programación de objetos, llamado herencia. Cualquier objeto vinculado a un nivel específico de una jerarquía de clases hereda todos los rasgos (así como los requisitos y cualidades) definidos dentro de cualquiera de las superclases.

La clase de inicio del objeto puede definir nuevos rasgos (así como requisitos y cualidades) que serán heredados por cualquiera de sus superclases.

No deberías tener ningún problema para hacer coincidir esta regla con ejemplos específicos, ya sea que se aplique a animales o vehículos.


3.1.6 ¿Qué contiene un objeto?

La programación orientada a objetos supone que cada objeto existente puede estar equipado con tres grupos de atributos:

Un objeto tiene un nombre que lo identifica de forma exclusiva dentro de su namespace (aunque también puede haber algunos objetos anónimos).

Un objeto tiene un conjunto de propiedades individuales que lo hacen original, único o sobresaliente (aunque es posible que algunos objetos no tengan propiedades).

Un objeto tiene un conjunto de habilidades para realizar actividades específicas, capaz de cambiar el objeto en sí, o algunos de los otros objetos.

Existe una pista (aunque esto no siempre funciona) que te puede ayudar a identificar cualquiera de las tres esferas anteriores. Cada vez que se describe un objeto y se usa:

Un sustantivo: probablemente se está definiendo el nombre del objeto.

Un adjetivo: probablemente se está definiendo una propiedad del objeto.

Un verbo: probablemente se está definiendo una actividad del objeto.

Dos ejemplos deberían servir como un buen ejemplo:

  • Un Cadillac rosa pasó rápidamente.
  • Nombre del objeto = Cadillac
  • Clase = Vehículos con ruedas
  • Propiedad = Color (rosa)
  • Actividad = Pasar (rápidamente)
  • Rodolfo es un gato grande que duerme todo el día.
  • Nombre del objeto = Rodolfo
  • Class = Gato
  • Propiedad = Tamaño (Grande)
  • Actividad = Dormir (Todo el día)




sábado, 25 de abril de 2026

Python II. Fundamentos de POO. secciones 3.1.1; 3.1.2; 3.1.3

Fuente: Cisco & Python Institute

3.1.1 Los conceptos básicos del enfoque orientado a objetos

Demos un paso fuera de la programación y las computadoras, y analicemos temas de programación orientada a objetos.

Casi todos los programas y técnicas que has utilizado hasta ahora pertenecen al estilo de programación procedimental. Es cierto que has utilizado algunos objetos incorporados, pero cuando nos referimos a ellos, se mencionan lo mínimo posible.

La programación procedimental fue el enfoque dominante para el desarrollo de software durante décadas de TI, y todavía se usa en la actualidad. Además, no va a desaparecer en el futuro, ya que funciona muy bien para proyectos específicos (en general, no muy complejos y no grandes, pero existen muchas excepciones a esa regla).

El enfoque orientado a objetos es bastante joven (mucho más joven que el enfoque procedimental) y es particularmente útil cuando se aplica a proyectos grandes y complejos llevados a cabo por grandes equipos formados por muchos desarrolladores.

Este tipo de programación en un proyecto facilita muchas tareas importantes, por ejemplo, dividir el proyecto en partes pequeñas e independientes y el desarrollo independiente de diferentes elementos del proyecto.

Python es una herramienta universal para la programación procedimental y orientada a objetos. Se puede utilizar con éxito en ambos enfoques.

Además, puedes crear muchas aplicaciones útiles, incluso si no se sabe nada sobre clases y objetos, pero debes tener en cuenta que algunos de los problemas (por ejemplo, el manejo de la interfaz gráfica de usuario) puede requerir un enfoque estricto de objetos.

Afortunadamente, la programación orientada a objetos es relativamente simple.


3.1.2 Enfoque procedimental versus el enfoque orientado a objetos

En el enfoque procedimental, es posible distinguir dos mundos diferentes y completamente separados: el mundo de los datos y el mundo del código. El mundo de los datos está poblado con variables de diferentes tipos, mientras que el mundo del código está habitado por códigos agrupados en módulos y funciones.

Las funciones pueden usar datos, pero no al revés. Además, las funciones pueden abusar de los datos, es decir, usar el valor de manera no autorizada (por ejemplo, cuando la función seno recibe el saldo de una cuenta bancaria como parámetro).

Los datos no pueden usar funciones. ¿Pero es esto completamente cierto? ¿Hay algunos tipos especiales de datos que puedan usar funciones?

Sí, los hay, los llamados métodos. Estas son funciones que se invocan desde dentro de los datos, no junto con ellos. Si puedes ver esta distinción, has dado el primer paso en la programación de objetos.

El enfoque orientado a objetos sugiere una forma de pensar completamente diferente. Los datos y el código están encapsulados juntos en el mismo mundo, divididos en clases.

Cada clase es como una receta que se puede usar cuando quieres crear un objeto útil. Puedes producir tantos objetos como necesites para resolver tu problema.

Cada objeto tiene un conjunto de rasgos (se denominan propiedades o atributos; usaremos ambas palabras como sinónimos) y es capaz de realizar un conjunto de actividades (que se denominan métodos).

Las recetas pueden modificarse si son inadecuadas para fines específicos y, en efecto, pueden crearse nuevas clases. Estas nuevas clases heredan propiedades y métodos de los originales, y generalmente agregan algunos nuevos, creando nuevas herramientas más específicas.


Los objetos son encarnaciones de las ideas expresadas en clases, como un pastel de queso en tu plato, es una encarnación de la idea expresada en una receta impresa en un viejo libro de cocina.

Los objetos interactúan entre sí, intercambian datos o activan sus métodos. Una clase construida adecuadamente (y, por lo tanto, sus objetos) puede proteger los datos sensibles y ocultarlos de modificaciones no autorizadas.

No existe un límite claro entre los datos y el código: viven como uno solo dentro de los objetos.

Todos estos conceptos no son tan abstractos como pudieras pensar al principio. Por el contrario, todos están tomados de experiencias de la vida real y, por lo tanto, son extremadamente útiles en la programación de computadoras: no crean vida artificial reflejan hechos reales, relaciones y circunstancias.

3.1.3 Jerarquía de clases

La palabra clases tiene muchos significados, pero no todos son compatibles con las ideas que queremos discutir aquí. La clase que nos concierne es como una categoría, como resultado de similitudes definidas con precisión.

Intentaremos señalar algunas clases que son buenos ejemplos de este concepto.


Veamos por un momento los vehículos. Todos los vehículos existentes (y los que aún no existen) están relacionados por una sola característica importante: la capacidad de moverse. Puedes argumentar que un perro también se mueve; ¿Es un perro un vehículo? No lo es. Tenemos que mejorar la definición, es decir, enriquecerla con otros criterios, distinguir los vehículos de otros seres y crear una conexión más fuerte. Consideremos las siguientes circunstancias: los vehículos son entidades creadas artificialmente que se utilizan para el transporte, movidos por fuerzas de la naturaleza y dirigidos (conducidos) por humanos.

Según esta definición, un perro no es un vehículo.

La clase Vehículos es muy amplia. Tenemos que definir clases especializadas. Las clases especializadas son las subclases. La clase Vehículos será una superclase para todas ellas.

Nota: la jerarquía crece de arriba hacia abajo, como raíces de árboles, no ramas. La clase más general y más amplia siempre está en la parte superior (la superclase) mientras que sus descendientes se encuentran abajo (las subclases).

A estas alturas, probablemente puedas señalar algunas subclases potenciales para la superclase Vehículos. Hay muchas clasificaciones posibles. Elegimos subclases basadas en el medio ambiente y decimos que hay (al menos) cuatro subclases:

  • Vehículos Terrestres.
  • Vehículos Acuáticos.
  • Vehículos Aéreos.
  • Vehículos Espaciales.

En este ejemplo, discutiremos solo la primera subclase: Vehículos Terrestres. Si lo deseas, puedes continuar con las clases restantes.

Los vehículos terrestres pueden dividirse aún más, según el método con el que impactan el suelo. Entonces, podemos enumerar:

  • Vehículos con ruedas.
  • Vehículos con pistas.
  • Aerodeslizadores.

La figura ilustra la jerarquía que hemos creado.

Ten en cuenta la dirección de las flechas: siempre apuntan a la superclase. La clase de nivel superior es una excepción: no tiene su propia superclase.

Otro ejemplo es la jerarquía del reino taxonómico de los animales.

Podemos decir que todos los animales (nuestra clase de nivel superior) se puede dividir en cinco subclases:

  • Mamíferos.
  • Reptiles.
  • Aves.
  • Peces.
  • Anfibios.

Tomaremos el primero para un análisis más detallado. Hemos identificado las siguientes subclases:

  • Mamíferos Salvajes.
  • Mamíferos Domesticados.


Intenta extender la jerarquía de la forma que quieras y encuentra el lugar adecuado para los humanos.

sábado, 22 de noviembre de 2025

Mas y mas de POO. Python para ciencia de datos

 Fuente: Google & Coursera

Más información sobre la programación orientada a objetos
Estado: Traducido automáticamente del Inglés

Nota: Esta lectura sólo contiene una breve introducción a la Programación orientada a objetos.

Anteriormente, identificamos la Programación orientada a objetos como un paradigma de programación que se basa en objetos, que pueden contener tanto datos como código que manipula esos datos. Recordarás que una clase es un tipo de datos de un objeto que agrupa datos y funcionalidad, y que has encontrado algunos ejemplos de esta funcionalidad específica de la clase en forma de métodos y atributos. En esta lectura, vas a aprender más sobre Programación orientada a objetos y cómo funciona. Tener una comprensión básica de cómo funciona este proceso será muy útil cuando te encuentres con estos conceptos a lo largo de tu viaje de aprendizaje.

Repaso: Atributos y métodos

Las clases de Python son poderosas y convenientes porque vienen con características incorporadas que simplifican las tareas comunes de análisis de datos. Estas características se conocen como atributos y métodos.

  • Atributo: Valor asociado a un objeto o clase al que se hace referencia por su nombre utilizando la notación de puntos.

  • Método: Una función que pertenece a una clase y que normalmente realiza una acción u operación.

Una forma más sencilla de entender la distinción entre atributos y métodos es recordar que los atributos son características del objeto, mientras que los métodos son acciones u operaciones.

Por ejemplo, si la clase fuera Spaceship, (nave espacial) entonces los atributos podrían ser:

name (nombre)

kind (tipo)

speed (velocidad)

tractor_beam (Rayo tractor)

Se podría acceder a estos atributos escribiendo:

Spaceship.name

Spaceship.kind

Spaceship.speed

Spaceship.tractor_beam

Nótese que a estas características se accede utilizando sólo un punto.

Por otro lado, los métodos de la clase Nave espacial podrían ser:

warp()

tractor()

Estos métodos podrían utilizarse escribiendo:

Spaceship.warp() 

Spaceship.tractor()

Observe que los métodos van seguidos de paréntesis, y que es posible que reciban argumentos. Por ejemplo, Spaceship.warp(7) podría cambiar la velocidad de la nave a warp 7.

Definir clases con atributos y métodos únicos

Python te permite definir tus propias clases, cada una con sus propios atributos y métodos especiales. Esto ayuda a todo tipo de programadores a construir código reutilizable que hace su trabajo más eficiente. Incluso puedes construir la clase Spaceship mencionada anteriormente. El ejemplo, aquí, demuestra cómo hacerlo.

Nota: El siguiente bloque de código no es interactivo.

# Ejemplo
class Nave_espacial:
   # Atributo de clase
   rayo_tractor = 'off'

   # Instancia de atributos
   def __init__(self, nombre, tipo):
       self.nombre = nombre
       self.tipo = tipo
       self.velocidad = None

  # Instancia de metodos
   def propulsion(self, propulsion):
       self.velocidad = propulsion
       print(f'Propulsion {propulsion}, iniciar!')

   def tractor(self):
       if self.rayo_tractor == 'off':
           self.rayotractor = 'on'
           print('rayo_tractor encendido.')
       else:
           self.rayo_tractor = 'off'
           print('rayo_tractor apagado')

Sólo observe que la clase en sí se define en primer lugar y, a continuación, con sangría debajo de ella son los atributos y métodos. Esto es lo que significa que un atributo o método "pertenece a una clase" Los atributos y métodos se definen en el código de esa clase.

Una clase es como un plano para todas las cosas que comparten características y comportamientos. En este caso, la clase es Nave Espacial. Puede haber diferentes clases de naves espaciales. Pueden tener diferentes nombres y diferentes propósitos. Cada vez que creas un objeto de una clase determinada, estás creando una instancia de esa clase. Esto también se conoce como instanciar la clase. En el código anterior, cada vez que instancias un objeto de la clase Nave Espacial comenzará con su rayo tractor desactivado. El rayo tractor es un atributo de la clase. Todas las instancias de la clase Nave Espacial tienen uno. También hay atributos de instancia. Estos son atributos que puedes asignar cuando instancias el objeto.

# Create an instance of the Spaceship class (i.e. "instantiate")

# Crea una instancia de la clase Nave_espacial
nave = Nave_espacial('Mockingbird','rescue frigate')

# Check ship's name
# Chequea el nombre de la clase
print(nave.nombre)

# Check what kind of ship it is
# Cheuea el tipo de nave que es
print(nave.tipo)

# Check tractor beam status
# Chequea el estado del rayo tractor
print(nave.rayo_tractor)

Resultado:
Mockingbird
rescue frigate
off
El siguiente bloque de código utiliza el método warp() propulsion para establecer la velocidad de propulsión en siete. Luego comprueba la velocidad actual de la nave utilizando el atributo speed velocidad.
# Set warp speed
# configure la velocidad de propulsion
nave.propulsion(7)

# Check speed
# Verifique la vvelocidad
nave.velocidad
Resultado:
Propulsion 7, iniciar!
7
Este último bloque de código utiliza el método tractor() para activar el rayo tractor. A continuación, comprueba el estado actual del haz tractor utilizando el atributo tractor_beam rayo-tractor.
# Toggle tractor beam
nave.tractor()

# Check tractor beam status
print(nave.rayo_tractor)

Resultado:
rayo_tractor encendido.
on

Este es sólo un ejemplo básico destinado a demostrar algunas de las formas fundamentales en que las clases, atributos y métodos funcionan y cómo se relacionan entre sí, pero las clases pueden ser muy complejas y tener muchos atributos y métodos. Dependiendo del trabajo que realice como profesional de los datos, los conocimientos sobre programación orientada a objetos le serán útiles a la hora de definir sus propias clases, atributos y métodos para investigar los patrones, las relaciones y el significado que tienen los datos.

Puntos clave

Las clases constituyen el núcleo de los objetos de Python, razón por la cual Python es conocido como un lenguaje orientado a objetos. Los objetos de clase son poderosos porque contienen herramientas únicas diseñadas específicamente para esa clase. Los métodos son funciones que pertenecen a una clase; realizan acciones u operaciones, y utilizan paréntesis. Los atributos son valores o características asociadas con una clase o instancia de clase; no utilizan paréntesis. Y, aunque hay muchas clases, atributos y métodos pre-construidos en Python, hay un alto nivel de personalización que ofrece el paradigma de programación orientada a objetos.




domingo, 19 de octubre de 2025

Python For Every body (Py4E) Seccion 14. POO

 Aquí tienes un resumen del documento "Pythonlearn-14-Objects.pptx":


El documento "Pythonlearn-14-Objects.pptx" se enfoca en los objetos en Python y la programación orientada a objetos (POO).

Conceptos Clave:
  • Programación Orientada a Objetos (POO): Un programa se compone de muchos objetos que cooperan entre sí. Cada objeto es como una "isla" dentro del programa que trabaja en conjunto con otros objetos. Los programas se construyen con uno o más objetos que utilizan las capacidades de los demás.
  • Objeto: Es una porción de código y datos autocontenida. Un aspecto clave del enfoque de objetos es dividir el problema en partes más pequeñas y comprensibles. Los objetos tienen límites que permiten ignorar detalles innecesarios. Hemos estado utilizando objetos todo el tiempo: objetos de cadena (String), objetos de enteros (Integer), objetos de diccionario (Dictionary), objetos de lista (List), etc.
  • Clase: Una plantilla que define las características abstractas de una cosa (objeto), incluyendo sus atributos (campos o propiedades) y sus comportamientos (métodos, operaciones o características). Una clase es como un "plano" o "fábrica" que describe la naturaleza de algo.
  • Instancia: Un objeto particular de una clase, creado en tiempo de ejecución. El conjunto de valores de los atributos de un objeto particular se llama su "estado". El objeto consiste en el estado y el comportamiento definido en la clase del objeto. "Objeto" e "Instancia" a menudo se usan indistintamente.
  • Método: Las habilidades de un objeto. En el lenguaje de programación, los métodos son verbos. Usar un método generalmente afecta solo a un objeto particular; todos los perros pueden ladrar, pero solo necesitas un perro en particular para que ladre. "Método" y "Mensaje" a menudo se usan indistintamente.
  • Atributo (Field): Un dato dentro de una clase.
  • dir() y type():
    • El comando dir() lista las capacidades de un objeto. Ignora los que tienen guiones bajos, ya que son utilizados por Python internamente. El resto son operaciones reales que el objeto puede realizar.
    • type() nos dice el tipo de una variable.
  • Ciclo de Vida de un Objeto: Los objetos se crean, se usan y se descartan. Hay bloques de código especiales (métodos) que se llaman en el momento de la creación (constructor) y en el momento de la destrucción (destructor).
  • Constructor (__init__): El propósito principal del constructor es establecer algunas variables de instancia con los valores iniciales adecuados cuando se crea el objeto. Los constructores son muy utilizados, mientras que los destructores son poco comunes. Los constructores pueden tener parámetros adicionales para configurar variables de instancia para una instancia particular de la clase.
  • Múltiples Instancias: Podemos crear muchos objetos, ya que la clase es la plantilla para el objeto. Cada objeto distinto se puede almacenar en su propia variable. Cada instancia tiene su propia copia de las variables de instancia.
  • Herencia: Permite reutilizar una clase existente y heredar todas sus capacidades, para luego añadir nuestras propias características a la nueva clase. La nueva clase (hija) tiene todas las capacidades de la clase antigua (padre) y algunas más.
El documento incluye ejemplos de código para ilustrar la creación de clases, objetos, el uso de constructores y destructores, y el concepto de herencia.

sábado, 18 de octubre de 2025

La importancia de Self en POO

 

self es una convención utilizada en la Programación Orientada a Objetos (POO), especialmente en lenguajes como Python, que se refiere a la instancia (el objeto) sobre la que se está ejecutando un método.


Función y Significado de self

La función principal de self es permitir que los métodos de una clase accedan y manipulen los atributos y otros métodos de ese objeto específico.

1. Referencia a la Instancia Actual (El Objeto)

  • Identidad: Cuando creas un objeto a partir de una clase (una instancia), self actúa como un puntero o una referencia a ese objeto recién creado.

  • Manejo de Métodos: Cada vez que llamas a un método en un objeto (ej: mi_coche.acelerar()), Python pasa automáticamente ese objeto (mi_coche) como el primer argumento al método acelerar(), y ese argumento se nombra por convención como self.

2. Acceso a Atributos de Instancia

La función más crucial de self es distinguir los atributos de la instancia de las variables locales dentro del método.

  • Ejemplo: Si una clase Coche tiene un atributo velocidad, dentro de un método como acelerar(), usas self.velocidad para acceder o modificar la velocidad del coche específico que llamó al método. Sin self, el método no sabría a qué variable velocidad se está refiriendo.

3. Definición del Método Constructor (__init__)

self es fundamental en el método constructor (__init__) de una clase:

  • __init__(self, ...): Este método se llama cuando se crea un nuevo objeto. self es el primer parámetro y se usa para inicializar los atributos de ese nuevo objeto.

En resumen:

FunciónPropósito
PunteroHace referencia al objeto que está llamando al método.
AccesoPermite a los métodos leer y modificar las variables internas (atributos) de ese objeto.
DistinciónSepara las variables locales del método de los atributos de la instancia.

Nota: Aunque el término estándar es self, en la mayoría de los lenguajes POO (como C++ o Java) se utiliza la palabra clave this con la misma función. El uso de self es una fuerte convención, pero no una palabra clave reservada, de Python.

sábado, 12 de julio de 2025

7 conceptos para demostrar que tienes conocimientos decentes en Python

 

Si puede responder correctamente estos 7 conceptos, eres decente en Python

¡Perfecto para cualquiera que quiera demostrar su experiencia en Python!

Sabrina Carpenter 🐍
 
 
  
 
 

Has escrito scripts de Python, proyectos creados e incluso aplicaciones implementadas. Pero el verdadero dominio radica en comprender la mecánica avanzada del lenguaje.

Disecemos siete conceptos que separan a los codificadores casuales de los expertos de Python. Si estos se sienten intuitivos, felicitaciones, eres oficialmente "decente" en Python. 

 

1. Metaclasses: clases de elaboración dinámica

Las metaclassas son las "fábricas de clase" de Python. Mientras has usado class Definiciones, MetAclasses le permiten personalizar la creación de clases mediante programación. 

class ValidatorMeta(type):
def __new__(cls, name, bases, dct):
# Enforce that all methods start with 'validate_'
for key in dct:
if key.startswith('validate_') and not callable(dct[key]):
raise TypeError(f"{key} must be a method")
return super().__new__(cls, name, bases, dct)

class UserValidator(metaclass=ValidatorMeta):
def validate_email(self, email):
return '@' in email
# Raises TypeError: 'invalid_method' is not callable
# class BadValidator(metaclass=ValidatorMeta):
# invalid_method = "not_a_function" 
 

Por qué esto importa : marcos como Django y Sqlalchemy usan metaclasses para generar esquemas de base de datos o impulsar las reglas de ORM. Al controlar la creación de clases, elimina los patrones de diseño de Boilerplate y aplica. 

2. Gerentes de contexto más allá with open()

Has usado with Para archivos, pero los gerentes de contexto personalizados manejan la limpieza de recursos para bases de datos, hilos o conexiones API. 

class DatabaseConnection:
def __init__(self, db_url):
self.db_url = db_url
self.connection =
None

def __enter__(self):
self.connection = connect(self.db_url)
return self.connection.cursor()
def __exit__(self, exc_type, exc_val, exc_tb):
if exc_type: # Handle exceptions here
self.connection.rollback()
else:
self.connection.commit()
self.connection.close()
# Usage:
with DatabaseConnection("postgres://user:pass@localhost") as cursor:
cursor.execute(
"DELETE FROM users WHERE inactive = TRUE")

Por qué esto importa : la gestión adecuada de los recursos evita las fugas de memoria y garantiza la integridad transaccional. Los casos de uso avanzados incluyen configuraciones de entorno temporales o sistemas de bloqueo distribuido. 

 

3. Decoradores con parámetros (sí, doble anidación)

Los decoradores se vuelven exponencialmente más poderosos cuando aceptan argumentos. Esto requiere anidar tres funciones: 

def retry(max_attempts=3, delay=2):
def decorator(func):
from time import sleep
def wrapper(*args, **kwargs):
attempts = 0
while attempts < max_attempts:
try:
return func(*args, **kwargs)
except Exception as e:
print(f"Attempt {attempts + 1} failed: {e}")
sleep(delay)
attempts += 1
raise RuntimeError("All retry attempts exhausted")
return wrapper
return decorator

@retry(max_attempts=5, delay=1)
def call_flaky_api():
# Simulate unreliable API
import random
if random.random() < 0.7:
raise ConnectionError("API timeout")
return "Success"
call_flaky_api()

 

Por qué esto es importante : los decoradores parametrizados le permiten crear utilidades reutilizables y configurables para registro, reintentos, limitación de tarifas o autenticación en todos los proyectos. 

 

4. Concurrencia con asyncio (No solo enhebrado)

La programación asincrónica no se trata de la velocidad bruta: se trata de manejar eficientemente tareas de E/S. Master the Event Loop:

import asyncio

async def fetch_data(url):
print(f"Fetching {url}")
await asyncio.sleep(2) # Simulate network call
return f"Data from {url}"
async def main():
tasks = [
asyncio.create_task(fetch_data("https://api.service1.com")),
asyncio.create_task(fetch_data("https://api.service2.com"))
]
results = await asyncio.gather(*tasks)
print(results)
asyncio.run(main()) # Executes both fetches concurrently in ~2 seconds

 

Por qué esto importa : las aplicaciones modernas exigen manejo de miles de conexiones simultáneas (servidores web, API de WebSocket). asyncio logra esto con una sobrecarga mínima en comparación con los hilos.

 


Entradas recientes

¿Existen herramientas para RCA (Root Cause Analysis) en Python?

Fuente: Gemini IA.  Sí, existen librerías especializadas en Python para realizar análisis de causa raíz (Root Cause Analysis o RCA), especi...

Entradas Populares