EJERCICIO 4_clase circulo pledin 3. Programación orientada a objetos
En Python, el símbolo @ se llama decorador. Piensa en un decorador como un "superpoder" o una etiqueta especial que se coloca encima de una función para modificar o extender su comportamiento sin cambiar su código base.
En tu programa, el @ se usa para crear Getters y Setters seguros, protegiendo el atributo radio.
Desglose paso a paso del código
1. El Constructor (__init__)
class circulo():
def __init__(self,radio):
self.radio=radio
Cuando creas un círculo con c1 = circulo(3), se ejecuta esta función.
Fíjate que asigna el valor usando self.radio = radio (llamando al setter que veremos más abajo, validando que el 3 sea mayor o igual a cero).
El Getter (@property)
@property
def radio(self):
print("Estoy dando el radio")
return self.__radio
¿Qué hace? Permite leer el valor del radio como si fuera una variable normal, pero ejecutando código en el medio.
Cuando en la celda 2 escribes c1.radio, Python no está leyendo una variable directa, está ejecutando esta función. Por eso en la consola aparece primero el mensaje Estoy dando el radio y luego te devuelve el número 3.
3. El Setter (@radio.setter)
@radio.setter
def radio(self,radio):
if radio>=0:
self.__radio = radio
else:
print("Radio debe ser positivo")
self.__radio=0
¿Qué hace? Permite modificar o asignar un nuevo valor al radio de forma controlada (por ejemplo,
c1.radio = 5).Su trabajo principal es validar que no te equivoques. Si intentas poner un radio negativo (como
-3), el programa intercepta el cambio, imprime "Radio debe ser positivo" y asigna0para evitar que el círculo tenga un tamaño inválido.
En resumen
Este código utiliza las propiedades de Python para encapsular los datos. En lugar de dejar que cualquiera cambie el radio libremente, el programa vigila cada vez que pides el radio (Getter) o intentas cambiarlo (Setter).
@property, @radio.setter
Técnicamente (lo que hacen): Ejecutan una transformación. Sin el
@property, Python creería quedef radio(self):es un método común y corriente al que tendrías que llamar con paréntesis (es decir, escribiendoc1.radio()). Al poner el@property, Python dice: "Ah, perfecto, ahora permitiré que lo llamen como si fuera una variable normal (c1.radio), pero ejecutando el código de adentro".
Piénsalo como un guardia de seguridad
Imagina que el decorador @ es como ponerle un uniforme de seguridad a una función:
El cartel dice "Guardaespaldas", pero lo importante es que, al llevar ese uniforme, la función ya no se comporta como una persona común: ahora se interpone automáticamente cada vez que alguien intenta leer (getter) o modificar (setter) el radio.
Cada vez que escribes
c1.radio, el@propertysalta y dice: "¡Espera! Antes de entregar el dato, ejecuta este código".Cada vez que intentas cambiar el valor, el
@radio.settersalta y dice: "¡Espera! Antes de guardar este número, déjame validarlo".
Ejercicio celda 1 google colab
class circulo():
def __init__(self,radio):
self.radio=radio
@property
def radio(self):
print("Estoy dando el radio")
return self.__radio
@radio.setter
def radio(self,radio):
if radio>=0:
self.__radio = radio
else:
print("Radio debe ser positivo")
self.__radio=0
Celda 2 de google colab (carb robleda...)
>>> c1=circulo(3)
>>> c1.radio
Estoy dando el radio
3
>>> c1.radio=4
>>> c1.radio=-1
Radio debe ser positivo
>>> c1.radio
0
@property (Getter): Es la ventanilla para leer el dato de forma limpia.
@radio.setter: Es el guardia de seguridad que valida que lo que intentan guardar tenga sentido antes de dejar entrar el dato a la caja fuerte.