Notice: This page requires JavaScript to function properly.
Please enable JavaScript in your browser settings or update your browser.
Aprenda Desafio: Representação e Comparação de Usuários | Métodos Mágicos
Programação Orientada a Objetos em Python Avançado

book
Desafio: Representação e Comparação de Usuários

Existem muitos métodos mágicos em Python, não consideramos todos eles, mas outros não são usados com tanta frequência.

Vamos voltar ao seu código. Sua classe User não tem representação, e você não pode imprimir informações do usuário usando a construção print(user). Além disso, há momentos em que você precisa verificar um nome de usuário ou ID de usuário com a instância do usuário (conta) que realizou ações em sua aplicação.

Nota

  • Os comentários O novo código está abaixo e O novo código está acima vão ajudá-lo a encontrar um novo código para edição.

  • Além disso, você precisa adicionar atributos de classe ao código existente.

Tarefa

Swipe to start coding

  1. Crie um atributo de classe role com o valor "User" dentro da classe User.
  2. Crie um atributo de classe role com o valor "Admin" dentro da classe Admin.
  3. Defina o método mágico de representação dentro da classe User. Este método deve retornar a string "{role}: {username}".
    Por exemplo ("Admin: greatest.admin").
  4. Defina o método mágico de comparação para a operação ==. Este método deve comparar:
    • se os dados recebidos são uma instância de User - comparar o username da instância e o username da instância recebida.
    • se os dados recebidos são uma string - comparar o username da instância e a string recebida.
    • se os dados recebidos têm outro tipo de dado - o método deve retornar False.

Solução

from abc import ABC, abstractmethod


class AuthMixin:
is_authenticated = False
def login(self, taken_password):
if self.password == taken_password:
self.is_authenticated = True
print(f"{self.username} is authenticated")
else:
print("Wrong password!")

def logout(self):
self.is_authenticated = False
print(f"{self.username} is loggouted")


class AbstractAdmin(ABC):
@abstractmethod
def login():
pass
@abstractmethod
def logout():
pass
@abstractmethod
def create_content():
pass
@abstractmethod
def update_content():
pass
@abstractmethod
Tudo estava claro?

Como podemos melhorá-lo?

Obrigado pelo seu feedback!

Seção 5. Capítulo 5
from abc import ABC, abstractmethod


class AuthMixin:
is_authenticated = False
def login(self, taken_password):
if self.password == taken_password:
self.is_authenticated = True
print(f"{self.username} is authenticated")
else:
print("Wrong password!")

def logout(self):
self.is_authenticated = False
print(f"{self.username} is loggouted")


class AbstractAdmin(ABC):
@abstractmethod
def login():
pass
@abstractmethod
def logout():
pass
@abstractmethod
def create_content():
pass
@abstractmethod
def update_content():
pass
@abstractmethod
def delete_content():
pass


class User(AuthMixin):
___ = ___
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 should be >= 8.")
else:
print("The password should be string.")

# ========== The new code is below ==========
def ___(self):
return f"{___}: {___}"
def ___(self, other):
# the User instance
if ___(other, User):
return self.___ == other.___
# string
if isinstance(other, ___):
return self.username == ___
return ___
# ========== The new code is above ==========


class Admin(User, AbstractAdmin):
___ = ___
def create_content(self):
print(f"{self.username} creates the content")
def update_content(self):
print(f"{self.username} updates the content")
def delete_content(self):
print(f"{self.username} deletes the content")


bob = User("bob.user123", "b123b321")
frank = Admin("frank.top.admin", "super_secret_admin_password")

toggle bottom row
some-alt