Notice: This page requires JavaScript to function properly.
Please enable JavaScript in your browser settings or update your browser.
@decorador_de_propiedad.setter | Encapsulamiento
Programación Orientada a Objetos en Python a Fondo
course content

Contenido del Curso

Programación Orientada a Objetos en Python a Fondo

Programación Orientada a Objetos en Python a Fondo

1. Conceptos de POO
2. Herencia
3. Encapsulamiento
4. Polimorfismo y Abstracción
5. Métodos Mágicos

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

1234567891011
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)
copy

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

12345678910111213141516171819
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)
copy

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

  1. La contraseña debe ser de tipo cadena.
  2. 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.

1234567891011121314151617181920212223242526272829303132
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)
copy

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.

¿Cómo definir un definidor de propiedades?

Selecciona unas respuestas correctas

¿Todo estuvo claro?

Sección 3. Capítulo 8
We're sorry to hear that something went wrong. What happened?
some-alt