calcular un atributo a partir del estado actual sin duplicar datos.
Entiende la idea
Un objeto puede ofrecer información que se obtiene de otros atributos. Si un producto guarda stock, disponible se deduce de si stock es mayor que cero. Guardar ambos valores obliga a mantenerlos sincronizados cada vez que cambia el stock.
Una property permite calcular esa información al consultarla como un atributo. Se define con una función y @property justo encima. Desde fuera escribes producto.disponible, sin paréntesis.
La función recibe self y devuelve el valor calculado. No hace falta guardar otro atributo disponible: cada consulta usa el stock actual. La sintaxis con @ aplica esta herramienta de Python; estudiarás los decoradores generales más adelante.
Usa una property cuando la operación se entiende como leer un dato. Una acción como vender, guardar o enviar debe seguir siendo un método. Una consulta aparentemente sencilla no debería esconder una petición lenta o una modificación inesperada.
Consulta después de un cambio
class Producto:
def __init__(self, stock):
self.stock = stock
@property
def disponible(self):
return self.stock > 0
producto = Producto(2)
print(producto.disponible)
producto.stock = 0
print(producto.disponible)True False
La primera consulta calcula 2 > 0 y devuelve True. Después el stock cambia a cero. La segunda vuelve a calcular y devuelve False. No hemos tenido que actualizar un segundo dato.
La property se lee sin paréntesis porque se presenta como información del objeto. Escribir producto.disponible() intentaría llamar al booleano obtenido, que no es una función, y produciría TypeError.
El estado sigue viviendo en stock. La property describe una relación con ese estado; no conserva una respuesta antigua. Esa diferencia elimina una fuente de incoherencias en objetos pequeños.
Practica con ayuda
Añade disponible como property y haz que devuelva la comparación con el stock de self. No crees self.disponible en el constructor: la práctica debe seguir reflejando los cambios posteriores.
Consulta un dato calculado
Añade una property disponible que calcule si queda stock. No guardes un segundo atributo que pueda desincronizarse.
True
Qué se comprueba
- stock positivo está disponible
- stock cero no está disponible
- la consulta refleja el estado actualizado
Al ejecutar verás los casos que necesitan revisión. No hay requisitos adicionales fuera del enunciado.
Usa 4 espacios de sangría al empezar una línea dentro de un bloque. Ctrl + Intro (⌘ + Intro en Mac) ejecuta. Tab pasa al siguiente control. Tu borrador se guarda en este navegador; Restablecer recupera el código inicial.
La salida aparecerá aquí.
Pista 1 · dónde mirar
Escribe @property sobre un método sin parámetros adicionales.
Pista 2 · qué idea usar
Devuelve self.stock > 0.
Pista 3 · un paso posible
Un paso de la solución: @property. Usa la explicación para colocarlo donde corresponde.
Ver una solución razonada
La property calcula stock > 0 cuando se consulta. Por eso no guardamos un segundo atributo que podría quedar desactualizado. Fuera se lee sin paréntesis.
class Producto:
def __init__(self, stock):
self.stock = stock
@property
def disponible(self):
return self.stock > 0
producto = Producto(2)
print(producto.disponible)Inténtalo tú
Un producto tenía stock 0 y después recibe 3 unidades. ¿Qué devuelve ahora una property que calcula self.stock > 0?
Comprobar y entender el porqué
True. La consulta usa el stock actual, que es 3. No conserva la respuesta False que habría obtenido cuando el stock era cero.
Qué debes recordar
- Una property presenta un cálculo como atributo.
- Se consulta sin paréntesis.
- Calcula a partir del estado actual.
- Evita duplicar información derivada.