Skip to content

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.


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**.
---
class Persona:
def __init__(self, nombre):
self.__nombre = nombre # atributo privado
def get_nombre(self):
return self.__nombre

Uso:

p = Persona("Ana")
print(p.get_nombre()) # ✅ Funciona

Pero se ve feo tener que escribir .get_nombre() cada vez. Ahí entra @property.


class Persona:
def __init__(self, nombre):
self.__nombre = nombre
@property
def nombre(self):
return self.__nombre

Uso:

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
@property
def nombre(self):
return self.__nombre
@nombre.setter
def nombre(self, nuevo_nombre):
if len(nuevo_nombre) > 0:
self.__nombre = nuevo_nombre
else:
print("❌ El nombre no puede estar vacío.")

Uso:

p = Persona("Carlos")
print(p.nombre) # ✅ Getter
p.nombre = "Andrés" # ✅ Setter
print(p.nombre) # Andrés
p.nombre = "" # ❌ El nombre no puede estar vacío.

@nombre.deleter
def nombre(self):
print("Eliminando el nombre...")
del self.__nombre