Curso de python nivel medio

¿Qué es property?

En Python, property es una función que permite controlar el acceso a los atributos de una clase mediante el uso de métodos en lugar de acceder directamente a los atributos. Esto te permite definir comportamiento personalizado cuando obtienes, estableces o eliminas un valor de un atributo. Usar property es útil para encapsular datos, permitiendo cambiar la implementación interna de una clase sin cambiar su interfaz pública.

¿Cómo funciona property?

La función property te permite definir tres cosas:

  1. Getter: Un método para obtener el valor del atributo.
  2. Setter: Un método para establecer el valor del atributo.
  3. Deleter (opcional): Un método para eliminar el atributo.
  4. Docstring (opcional): Un string para documentar el atributo.

Ejemplo básico usando property

Vamos a ver cómo funciona property con un ejemplo sencillo:

1class Persona:
2    def __init__(self, nombre):
3        self._nombre = nombre  # Atributo "privado"
4
5    @property
6    def nombre(self):
7        return self._nombre
8
9    @nombre.setter
10    def nombre(self, nuevo_nombre):
11        if isinstance(nuevo_nombre, str) and nuevo_nombre:
12            self._nombre = nuevo_nombre
13        else:
14            raise ValueError("El nombre debe ser una cadena no vacía.")
15
16# Crear una instancia de la clase Persona
17persona1 = Persona("Ana")
18
19# Usar el getter para obtener el nombre
20print(persona1.nombre)  # Resultado: Ana
21
22# Usar el setter para cambiar el nombre
23persona1.nombre = "Carlos"
24print(persona1.nombre)  # Resultado: Carlos
25
26# Intentar establecer un nombre no válido (esto lanzará una excepción)
27# persona1.nombre = ""  # Descomenta esta línea para ver el error
Salida de Consola!:
Ana
Carlos
  • ¿Qué hace este código?:
    • Define una clase Persona con un atributo "privado" _nombre.
    • El método nombre decorado con @property actúa como un getter, permitiendo acceder al atributo _nombre de manera controlada.
    • El método nombre decorado con @nombre.setter actúa como un setter, permitiendo establecer el valor de _nombre con validación.
    • Intentar establecer un nombre no válido (como una cadena vacía) lanzará una excepción ValueError.

Ejemplo con deleter

Ahora, veamos cómo podemos usar un deleter con property para eliminar un atributo:

1class Persona:
2    def __init__(self, nombre):
3        self._nombre = nombre
4
5    @property
6    def nombre(self):
7        return self._nombre
8
9    @nombre.setter
10    def nombre(self, nuevo_nombre):
11        if isinstance(nuevo_nombre, str) and nuevo_nombre:
12            self._nombre = nuevo_nombre
13        else:
14            raise ValueError("El nombre debe ser una cadena no vacía.")
15
16    @nombre.deleter
17    def nombre(self):
18        print(f"Eliminando el nombre '{self._nombre}'")
19        del self._nombre
20
21# Crear una instancia de la clase Persona
22persona1 = Persona("Ana")
23
24# Eliminar el nombre usando el deleter
25del persona1.nombre
26
27# Intentar acceder al atributo después de eliminarlo (esto lanzará un AttributeError)
28# print(persona1.nombre)  # Descomenta esta línea para ver el error
Salida de Consola!:
Eliminando el nombre 'Ana'
  • ¿Qué hace este código?:
    • Añade un deleter para el atributo nombre, que permite eliminar el atributo _nombre.
    • Cuando llamas a del persona1.nombre, se ejecuta el método nombre.deleter.
    • Intentar acceder a persona1.nombre después de eliminarlo lanzará un AttributeError.

¿Por qué usar property?

  • Encapsulación: Permite controlar cómo se accede y modifica un atributo, encapsulando la lógica de validación y otros comportamientos.
  • Flexibilidad: Te permite cambiar la implementación interna de cómo se almacena un atributo sin cambiar cómo se usa desde fuera de la clase.
  • Simplicidad: Hace que el código que usa la clase sea más limpio, ya que puedes acceder a los atributos como si fueran públicos, mientras en realidad están gestionados por métodos.

Conclusión

La función property en Python es una herramienta poderosa para controlar el acceso a los atributos de una clase, permitiendo definir getters, setters, y deleters. Esto te permite encapsular y validar datos, mejorando la seguridad y flexibilidad de tus clases. ¡Practica usando property para ver cómo puedes controlar mejor los datos dentro de tus objetos y mantener tu código limpio y eficiente!

  • Loading...