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

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

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

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

Como definir um setter de propriedade?

Selecione algumas respostas corretas

Tudo estava claro?

Como podemos melhorá-lo?

Obrigado pelo seu feedback!

Seção 3. Capítulo 8
We use cookies to make your experience better!
some-alt