En Python, en principio, el acceso a todos los atributos y métodos es público. En otros leguajes como JAVA se ha de indicar si el atributo o método es público (Public) o privado (Privae).
Si deseamos utilizar atributos o métodos privados en Python lo que hacemos es usar el prefijo de doble barra baja:
Pero esta forma de trabajar se la puede saltar por parte de un programador experimentado.
class Piloto:
def __init__(self):
self.edad = 0
def get_edad(self): # método getter
print("Se ha llamado al método getter")
return self.edad
def set_edad(self, e): # método setter
if e < 18: # e es una variable auxiliar que representa la edad
print("Los menores de edad no pueden pilotar.")
print("Se ha llamado al método setter")
self.edad = e
leo = Piloto()
leo.edad # acceso directo a la edad, similar a get_edad()
# pero a get_edad() podemos añadirle algo de lógica
0
leo.set_edad(29) # similar a leo.edad=29 pero al set le podemos añadir lógica
leo.edad
Se ha llamado al método setter
29
leo.get_edad()
Se ha llamado al método getter
29
Probar con una edad de 9 años y veremos la frase 'Los menores de edad no pueden pilotar'
Usando decoradores conseguimos ocultar completamente los atributos y métodos para que no sean accesibles desde fuera de la clase.
El método getter se consigue con el decorador @property. Debajo de él la función se tiene que llamar necesariamente edad.
El método setter se consigue con el decorador de nombre obligatorio @edad.setter y la función debe llamarse necesariamente edad.
class Piloto:
def __init__(self):
self._edad = 0
@property # usando un decorador como método getter
def edad(self):
print("Se ha llamado al método getter")
return self._edad
@edad.setter # método setter
def edad(self, e): # e es una variable auxiliar que representa la edad
if e < 18:
raise ValueError("Los menores de edad no pueden pilotar") # forzamos este error
print("Se ha llamado al método setter")
self._edad = e
leo = Piloto()
leo.edad = 29 # si ponemos una edad de un menor salta un error que nosotros hemos forzado con raise
print(leo.edad)
Se ha llamado al método setter Se ha llamado al método getter 29