Conteúdo do Curso
Programação Orientada a Objetos em Python Avançado
Programação Orientada a Objetos em Python Avançado
@property.setter
Vamos voltar à classe User
com um atributo privado password
que não pode ser alterado em subclasses. Como podemos acessar a senha privada? Vamos criar uma propriedade que retorne a senha 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)
Atualmente, podemos recuperar a senha, mas não podemos alterá-la usando a sintaxe regular. Para ser capaz de definir um valor para uma propriedade, precisamos usar o decorador @{nome da propriedade}.setter
, onde {nome da propriedade}
é o nome da propriedade que criamos (aquela para a qual queremos definir um 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)
O decorador @password.setter
indica que este método deve ser invocado sempre que a propriedade password
for atribuída a um novo valor. O segundo método password
é decorado por @password.setter
(onde password
é o nome do método da propriedade) e configura uma nova senha por meio da operação de atribuição (=
). O método setter de password
recebe dois parâmetros: self
(referindo-se à instância da classe) e new_password
(representando o novo valor sendo atribuído ao atributo password
).
Vamos escolher as seguintes restrições para a senha:
- A senha deve ser do tipo string.
- O comprimento da senha deve ser maior que 8.
Se a nova senha não atender aos requisitos, as mensagens correspondentes serão impressas.
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 garante que sempre que um novo valor é atribuído ao atributo password
, ele passa por verificações de validação quanto ao comprimento e tipo, fornecendo um retorno adequado se a nova senha não atender aos requisitos.
Obrigado pelo seu feedback!