Decorador de propiedades en Python

Manav Narula 21 junio 2023
  1. Propiedades en Python
  2. Usa el decorador @property en Python
Decorador de propiedades en Python

Podemos crear nuestras clases y definir diferentes miembros de datos y funciones en Python. Todo es un objeto, y podemos instanciar objetos de nuestra propia clase definida.

Este tutorial demostrará el uso del decorador de propiedades de Python (@property).

Propiedades en Python

A veces, usamos las funciones getter y setter de Python para devolver un atributo de clase no público.

Creamos una función dentro de la clase que devuelve este atributo, la función captador.

La función que puede establecer el valor de dicho atributo se denomina función setter.

Ejemplo:

class A:
    def __init__(self, a):
        self._a = a

    def getter_a(self):
        return self._a

    def setter_a(self, val):
        self._a = val


n = A(5)
print(n.getter_a())
n.setter_a(10)
print(n.getter_a())

Producción :

5
10

En el ejemplo anterior, creamos las funciones getter y setter que devuelven y cambian el valor del atributo de a.

Este método no se considera la forma Pythonic de tratar con atributos. Podemos eliminar la necesidad de agrupar la clase con métodos getter y setter.

El enfoque de Python implica el uso de propiedades que pueden establecer funcionalidades para un atributo de clase determinado.

Utilizando la función propiedad(), creamos objetos de la clase propiedad. Adjuntamos los métodos getter, setter y deleter como propiedades para un miembro de datos.

Para esto, usamos los argumentos fget, fset, fdel y doc dentro de la función de propiedad.

La función asociada a fget devolverá el valor del atributo. De manera similar, el método fset alterará el valor del atributo, y la función fdel eliminará el valor.

El método doc proporciona la documentación para un atributo dado.

Los usaremos en el siguiente código.

class A:
    def __init__(self, a):
        self._a = a

    def get_a(self):
        return self._a

    def set_a(self, val):
        self._a = val

    def del_a(self):
        del self._a
        print("Deleted")

    a = property(fget=get_a, fset=set_a, fdel=del_a, doc="Documenttion for a")


n = A(5)
print(n.a)
n.a = 10
print(n.a)
del n.a
print(n.a)

Producción :

5
10
Deleted
Traceback (most recent call last):
  File "<string>", line 21, in <module>
File "<string>", line 6, in get_a
AttributeError: 'A' object has no attribute '_a'

En el ejemplo anterior, creamos la propiedad a para la clase y agregamos las propiedades necesarias. Como puedes observar, luego de usar la propiedad deleted, obtenemos el AttributeError que indica que el atributo ha sido eliminado.

Usa el decorador @property en Python

Los decoradores se utilizan en Python para agregar funcionalidad adicional a una función. Se toma una función como argumento y se devuelve otra función.

Después de introducir los decoradores en Python, el uso de la función property() para establecer las propiedades disminuyó, y se prefirió la sintaxis del decorador para las mismas.

Los decoradores se introdujeron en Python v2.4. El decorador @property se hizo popular para crear propiedades.

Usaremos el decorador @property en el ejemplo anterior a continuación.

class A:
    def __init__(self, a):
        self._a = a

    @property
    def a(self):
        return self._a

    @a.setter
    def a(self, val):
        self._a = val

    @a.deleter
    def a(self):
        del self._a
        print("Deleted")


n = A(5)
print(n.a)
n.a = 10
print(n.a)
del n.a
print(n.a)

Producción :

5
10
Deleted
Traceback (most recent call last):
  File "<string>", line 23, in <module>
File "<string>", line 7, in a
AttributeError: 'A' object has no attribute '_a'

Como puede observar, obtuvimos el mismo resultado que obtuvimos en el ejemplo anterior. Este método es relativamente fácil de usar que la función property().

Con el decorador @property, usamos la función que devuelve el atributo como el nombre de la propiedad. Después de eso, @<property-name>.setter y @<property-name>.deleter agregarán los métodos setter y deleter.

Manav Narula avatar Manav Narula avatar

Manav is a IT Professional who has a lot of experience as a core developer in many live projects. He is an avid learner who enjoys learning new things and sharing his findings whenever possible.

LinkedIn

Artículo relacionado - Python Property