Property
Decorador @property
Section titled “Decorador @property”@property se usa para encapsular atributos, añadir validaciones o lógica interna, pero sin cambiar la forma natural de acceder o modificar una variable.
¿Qué hace @property en Python?
Section titled “¿Qué hace @property en Python?”El decorador @property convierte un método de una clase en un atributo “solo de lectura” (al menos inicialmente).
Sirve para controlar cómo se accede a un atributo, pero permitiendo que el código parezca estar accediendo directamente a una variable.
En otras palabras:
Permite usar *métodos* como sí fueran *atributos*, **sin cambiar la sintaxis de acceso**.---
Ejemplo básico sin @property
Section titled “Ejemplo básico sin @property”class Persona:def __init__(self, nombre):self.__nombre = nombre # atributo privado
def get_nombre(self):return self.__nombreUso:
p = Persona("Ana")print(p.get_nombre()) # ✅ FuncionaPero se ve feo tener que escribir .get_nombre() cada vez. Ahí entra @property.
Con @property
Section titled “Con @property”class Persona:def __init__(self, nombre):self.__nombre = nombre
@propertydef nombre(self):return self.__nombreUso:
p = Persona("Luis")print(p.nombre) # ✅ Sin paréntesis, parece un atributo- Python llama automáticamente al método nombre() cuando escribes p.nombre.
- Es solo de lectura por ahora (no se puede cambiar el valor directamente).
Agregando un setter para modificar el valor
Section titled “Agregando un setter para modificar el valor”class Persona:def __init__(self, nombre):self.__nombre = nombre
@propertydef nombre(self):return self.__nombre
@nombre.setterdef nombre(self, nuevo_nombre):if len(nuevo_nombre) > 0:self.__nombre = nuevo_nombreelse:print("❌ El nombre no puede estar vacío.")Uso:
p = Persona("Carlos")print(p.nombre) # ✅ Getterp.nombre = "Andrés" # ✅ Setterprint(p.nombre) # Andrésp.nombre = "" # ❌ El nombre no puede estar vacío.También existe el deleter (opcional)
Section titled “También existe el deleter (opcional)”@nombre.deleterdef nombre(self):print("Eliminando el nombre...")del self.__nombre