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 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