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.

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

Pratique por conta própria: Compilador de Python online