sto puede ser importante con ciertas variables que no queremos que sean accesibles
desde el exterior de una manera no controlada. Al definir la propiedad con
@property el acceso a ese atributo se realiza a través de una función, siendo por
lo tanto un acceso controlado.
class Clase:
def __init__(self, mi_atributo):
self.__mi_atributo = mi_atributo
@property
def mi_atributo(self):
# El acceso se realiza a través de este "método" y
# podría contener código extra y no un simple retorno
return self.__mi_atributo
Otra utilidad podría ser la consulta de un parámetro que requiera de muchos
cálculos. Se podría tener un atributo que no estuviera directamente almacenado en
la clase, sino que precisara de realizar ciertos cálculos. Para optimizar esto, se
podrían hacer los cálculos sólo cuando el atributo es consultado.
Por último, existen varios añadidos al decorador @property como pueden ser el
setter. Se trata de otro decorador que permite definir un “método” que modifica el
contenido del atributo que se esté usando.
class Clase:
def __init__(self, mi_atributo):
self.__mi_atributo = mi_atributo
@property
def mi_atributo(self):
return self.__mi_atributo
@mi_atributo.setter
def mi_atributo(self, valor):
if valor != "":
print("Modificando el valor")
self.__mi_atributo = valor
else:
print("Error está vacío")
De esta forma podemos añadir código al setter, haciendo que por ejemplo realice
comprobaciones antes de modificar el valor. Esto es una cosa que de usar un
atributo normal no podríamos hacer, y es muy útil de cara a la encapsulación.
mi_clase = Clase("valor_atributo")
mi_clase.mi_atributo
# 'valor_atributo'
mi_clase.mi_atributo = "nuevo_valor"
mi_clase.mi_atributo
# 'nuevo_valor'
mi_clase.mi_atributo = ""
# Error está vacío
Resulta lógico pensar que si un determinado atributo pertenece a una clase, si
queremos modificarlo debería de tener la “aprobación” de la clase, para asegurarse
que ninguna entidad externa está “haciendo cosas raras”.
Anterior