Saltar al contenido

¿Cómo usar @property en Python para crear getters y setters fácilmente?

28/04/2025
¿Cómo usar @property para getters y setters?
Compartir:
Índice de Contenido

Introducción al uso de @property en Python

En Python, el manejo de atributos en clases puede realizarse de diferentes maneras. Tradicionalmente, se han utilizado métodos getters y setters para acceder y modificar los valores de los atributos privados. Sin embargo, Python ofrece una forma más elegante y sencilla de lograr esto: el decorador @property.

A lo largo de este artículo, aprenderás cómo usar @property para crear getters y setters fácilmente, mejorando la legibilidad y la encapsulación de tus clases en Python.

¿Qué es el decorador @property?

Quizás también te interese:  ¿Cómo usar try, except, else y finally en Python? Guía completa con ejemplos prácticos

El decorador @property es una herramienta poderosa en Python que permite definir métodos que se comportan como atributos. Es decir, puedes acceder a los métodos como si fueran variables, lo que mejora la interfaz de tus objetos y permite controlar el acceso y la modificación de los datos internos de manera sencilla.

¿Por qué usar @property para getters y setters?

Utilizar @property en vez de métodos get_ y set_ tradicionales tiene varias ventajas:

  • Encapsulación: Protege los datos internos de la clase.
  • Legibilidad: Permite acceder a los atributos como si fueran variables, sin tener que llamar a métodos explícitamente.
  • Mantenibilidad: Permite agregar validaciones o lógica adicional sin modificar el código que usa la clase.

¿Cómo usar @property para crear getters y setters?

A continuación, te mostramos cómo crear getters y setters con @property paso a paso:

Paso 1: Definir el atributo privado

Lo primero es definir un atributo privado en la clase, usando la convención de un guion bajo (_).

class Persona:
    def __init__(self, nombre):
        self._nombre = nombre


Paso 2: Crear el getter usando @property

Ahora, define un método con el mismo nombre que el atributo, y decóralo con @property. Este método actuará como el getter.

class Persona:
    def __init__(self, nombre):
        self._nombre = nombre

    @property
    def nombre(self):
        return self._nombre

Ahora puedes acceder al atributo nombre como si fuera público:

p = Persona("Ana")
print(p.nombre)  # Imprime: Ana

Paso 3: Crear el setter usando @nombre.setter

Para permitir modificar el atributo, define un método con el mismo nombre, pero decorado con @nombre.setter (donde nombre es el nombre de la propiedad).

class Persona:
    def __init__(self, nombre):
        self._nombre = nombre

    @property
    def nombre(self):
        return self._nombre

    @nombre.setter
    def nombre(self, valor):
        if not isinstance(valor, str):
            raise ValueError("El nombre debe ser una cadena de texto")
        self._nombre = valor

Ahora puedes asignar un nuevo valor usando la sintaxis de atributo:

p = Persona("Ana")
p.nombre = "Luis"
print(p.nombre)  # Imprime: Luis

Paso 4: (Opcional) Crear un deleter usando @nombre.deleter

Si deseas permitir eliminar el atributo, puedes agregar un método deleter:

class Persona:
    def __init__(self, nombre):
        self._nombre = nombre

    @property
    def nombre(self):
        return self._nombre

    @nombre.setter
    def nombre(self, valor):
        if not isinstance(valor, str):
            raise ValueError("El nombre debe ser una cadena de texto")
        self._nombre = valor

    @nombre.deleter
    def nombre(self):
        del self._nombre

Ahora puedes eliminar el atributo con del p.nombre.

Ventajas de usar @property frente a getters y setters tradicionales

Quizás también te interese:  ¿Cómo crear excepciones personalizadas en programación paso a paso?

¿Cómo usar @property para crear getters y setters fácilmente? La respuesta es que @property permite definir acceso controlado a los atributos sin cambiar la interfaz de la clase. Por ejemplo, si tu clase empieza usando un atributo público y después necesitas agregar validación, puedes cambiarlo a una propiedad sin modificar el código que usa la clase.

Ejemplo completo: Controlando el acceso a un atributo

Veamos un ejemplo práctico donde usamos @property para definir getters y setters que validan la edad de una persona:

class Persona:
    def __init__(self, nombre, edad):
        self._nombre = nombre
        self._edad = edad

    @property
    def edad(self):
        return self._edad

    @edad.setter
    def edad(self, valor):
        if valor < 0:
            raise ValueError("La edad no puede ser negativa")
        self._edad = valor

p = Persona("María", 30)
print(p.edad)  # 30
p.edad = 35
print(p.edad)  # 35
# p.edad = -5  # Lanza ValueError
Quizás también te interese:  ¿Cuál es la diferencia entre == e is en Python? Explicación fácil con ejemplos

Resumen y buenas prácticas

  • Usa @property para exponer atributos con lógica adicional (validación, cálculos, etc.) manteniendo una interfaz limpia.
  • Prefiere @property sobre los métodos get_ y set_ tradicionales en Python, por legibilidad y mantenibilidad.
  • Recuerda usar atributos privados (con un guion bajo) para evitar accesos directos no controlados.

En conclusión, el decorador @property es la forma recomendada en Python para crear getters y setters fácilmente, permitiendo un código más limpio, seguro y profesional.

Compartir: