Notice: This page requires JavaScript to function properly.
Please enable JavaScript in your browser settings or update your browser.
@property.setter | Encapsulamento
Programação Orientada a Objetos em Python Avançado
course content

Conteúdo do Curso

Programação Orientada a Objetos em Python Avançado

Programação Orientada a Objetos em Python Avançado

1. Conceitos de POO
2. Herança
3. Encapsulamento
4. Polimorfismo e Abstração
5. Métodos Mágicos

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

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

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

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

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:

  1. A senha deve ser do tipo string.
  2. O comprimento da senha deve ser maior que 8.

Se a nova senha não atender aos requisitos, as mensagens correspondentes serão impressas.

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

Como definir um setter de propriedade?

Selecione algumas respostas corretas

Tudo estava claro?

Seção 3. Capítulo 8
We're sorry to hear that something went wrong. What happened?
some-alt