Menu
Coddy logo textTech

Introdução aos Métodos Mágicos

Parte da seção Object Oriented Programming do Journey de Python da Coddy — lição 33 de 64.

Métodos mágicos (também chamados de métodos dunder) são métodos especiais com sublinhados duplos no início e no fim. O Python os chama automaticamente em resposta a certas operações.

Aqui está um exemplo de uma classe com métodos mágicos:

class Book:
    def __init__(self, title, author, pages):
        self.title = title
        self.author = author
        self.pages = pages
    
    def __str__(self):
        return f"{self.title} by {self.author}"

O método __init__ é chamado automaticamente quando você cria um objeto:

my_book = Book("Python Programming", "John Smith", 350)

O método __str__ é chamado automaticamente quando você converte o objeto em uma string:

print(my_book)        # Chama __str__ automaticamente
print(str(my_book))   # Também chama __str__

Saída:

Python Programming by John Smith
Python Programming by John Smith

Sem o __str__, a impressão mostraria o local da memória do objeto:

class SimpleBook:
    def __init__(self, title):
        self.title = title

simple = SimpleBook("Test Book")
print(simple)  # <__main__.SimpleBook object at 0x...>

Adicione outro método mágico para o comprimento:

class Book:
    def __init__(self, title, author, pages):
        self.title = title
        self.author = author
        self.pages = pages
    
    def __str__(self):
        return f"{self.title} by {self.author}"
    
    def __len__(self):
        return self.pages

my_book = Book("Python Programming", "John Smith", 350)
print(len(my_book))   # Chama __len__ automaticamente

Saída:

350

Ponto Chave: Métodos mágicos começam e terminam com duplos underscores (__method__) e são chamados automaticamente pelo Python. Eles permitem que seus objetos funcionem com funções integradas como str(), len() e operadores, tornando suas classes mais Pythonic e intuitivas de usar.

challenge icon

Desafio

Fácil

Neste desafio, você implementará uma classe Counter com métodos mágicos.

  • counter.py - Este é o arquivo que você precisa editar, contendo comentários TODO para guiar sua implementação
  • driver.py - Contém casos de teste extensivos

Implemente a classe Counter em counter.py e os casos de teste em driver.py seguindo os comentários TODO. A classe deve suportar inicialização com valores opcionais, representação em string e operações de adição.

Folha de consulta

Métodos mágicos (métodos dunder) são métodos especiais com sublinhados duplos que o Python chama automaticamente em resposta a certas operações.

Métodos mágicos comuns:

  • __init__ - Chamado ao criar um objeto
  • __str__ - Chamado ao converter para string com str() ou print()
  • __len__ - Chamado ao usar a função len()
class Book:
    def __init__(self, title, author, pages):
        self.title = title
        self.author = author
        self.pages = pages
    
    def __str__(self):
        return f"{self.title} by {self.author}"
    
    def __len__(self):
        return self.pages

my_book = Book("Python Programming", "John Smith", 350)
print(my_book)        # Chama __str__ automaticamente
print(len(my_book))   # Chama __len__ automaticamente

Sem o __str__, a impressão mostra a localização de memória do objeto em vez de um formato legível.

Experimente você mesmo

# TODO: Importar a classe Counter de counter.py
# Use o formato: from counter import Counter

# Manipulador abrangente de casos de teste
test_case = input()

if test_case == "init_test":
    # TODO: Testar a inicialização com valor padrão
    # Criar um contador sem argumentos e imprimi-lo
    # Saída esperada: "Count: 0"
    pass

elif test_case == "init_with_value":
    # TODO: Testar a inicialização com um valor específico
    # Criar um contador com valor inicial 10 e imprimi-lo
    # Nota: print() chama implicitamente __str__, mas nosso foco aqui é testar __init__
    # Saída esperada: "Count: 10"
    pass


elif test_case == "addition":
    # TODO: Testar a operação de adição
    # Criar um contador com valor 3, adicionar 7 a ele e imprimir o resultado
    # Saída esperada: "Count: 10"
    pass

elif test_case == "chained_addition":
    # TODO: Testar operações de adição encadeadas
    # Criar um contador com valor 1, adicionar 2, depois adicionar 3 ao resultado e imprimir
    # Saída esperada: "Count: 6"
    pass

elif test_case == "negative_values":
    # TODO: Testar com valores negativos
    # Criar um contador com valor -5 e imprimi-lo
    # Em seguida, adicionar -3 a ele e imprimir o resultado
    # Saídas esperadas: "Count: -5" e "Count: -8"
    pass

elif test_case == "zero_value":
    # TODO: Testar com valores zero
    # Criar um contador com valor 0, adicionar 0 e imprimir
    # Saída esperada: "Count: 0"
    pass

elif test_case == "large_values":
    # TODO: Testar com valores grandes
    # Criar um contador com valor 1000000 e adicionar 9000000
    # Saída esperada: "Count: 10000000"
    pass

elif test_case == "multiple_counters":
    # TODO: Testar a interação entre múltiplos contadores
    # Criar counter1 com valor 5 e counter2 com valor 10
    # Imprimir ambos os contadores
    # Saídas esperadas: "Count: 5" e "Count: 10"
    pass

elif test_case == "type_validation":
    # TODO: Testar a adição de tipos diferentes
    # Tentar adicionar um float (2.5) a um contador com valor 5
    # Saída esperada: "Count: 7.5"
    pass
quiz iconTeste seus conhecimentos

Esta lição inclui um quiz rápido. Comece a lição para respondê-lo e acompanhar seu progresso.

Todas as lições de Object Oriented Programming