Contenido del Curso
Programación Orientada a Objetos en Python a Fondo
Programación Orientada a Objetos en Python a Fondo
@decorador_de_propiedad.setter
Volvamos a la clase User
con un atributo privado password
que no se puede cambiar en las subclases. ¿Cómo podemos acceder a la contraseña privada? Creemos una propiedad que devuelva la contraseña privada:
class User: def __init__(self, username, password): self.username = username self.__password = password @property def password(self): return self.__password bob = User("bob123top", "bob123456") print(bob.password)
Actualmente, podemos recuperar la contraseña pero no podemos cambiarla usando la sintaxis regular. Para poder establecer un valor para una propiedad, necesitamos utilizar el decorador @{nombre propiedad}.setter``, donde
{nombre propiedad}` es el nombre de la propiedad que hemos creado (aquella para la que queremos establecer un setter).
class User: def __init__(self, username, password): self.username = username self.__password = password @property def password(self): return self.__password @password.setter def password(self, new_password): self.__password = new_password bob = User("bob123top", "bob123456") print("(old)", bob.password) bob.password = "new_bob_password_123" print("(new)", bob.password)
El decorador @password.setter
indica que este método debe ser invocado siempre que a la propiedad password
se le asigne un nuevo valor. El segundo método password
está decorado por @password.setter
(donde password
es el nombre del método de la propiedad) y establece una nueva contraseña mediante la operación assignment (=
). El método password
setter toma dos parámetros: self
(que se refiere a la instancia de la clase) y new_password
(que representa el nuevo valor que se asigna al atributo password
).
Escojamos las siguientes restricciones de contraseña
- La contraseña debe ser de tipo cadena.
- La longitud de la contraseña debe ser mayor que 8.
Si la nueva contraseña no cumple los requisitos, se imprimirán los mensajes correspondientes.
class User: def __init__(self, username, password): self.username = username self.__password = password @property def password(self): return self.__password @password.setter def password(self, new_password): if isinstance(new_password, str): if len(new_password) >= 8: self.__password = new_password else: print("The password length must be >= 8") else: print("Password must be STRING") bob = User("bob123top", "bob123456") print("(old)", bob.password) bob.password = 122 print("(old)", bob.password) bob.password = "123" print("(old)", bob.password) bob.password = "bob.top.user.123" print("(new)", bob.password)
Este código garantiza que cada vez que se asigna un nuevo valor al atributo password
, éste se somete a comprobaciones de validación de longitud y tipo, proporcionando la información adecuada si la nueva contraseña no cumple los requisitos.
¡Gracias por tus comentarios!