Menu
Coddy logo textTech

Introduzione ai metodi magici

Fa parte della sezione Programmazione orientata agli oggetti del percorso Python di Coddy. Lezione 33 di 64.

I metodi magici (chiamati anche metodi dunder) sono metodi speciali con due trattini bassi all’inizio e alla fine. Python li chiama automaticamente in risposta a determinate operazioni.

Ecco un esempio di una classe con metodi magici:

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}"

Il metodo __init__ viene chiamato automaticamente quando crei un oggetto:

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

Il metodo __str__ viene chiamato automaticamente quando converti l'oggetto in una stringa:

print(my_book)        # Chiama __str__ automaticamente
print(str(my_book))   # Chiama anche __str__

Output:

Python Programming by John Smith
Python Programming by John Smith

Senza __str__, la stampa mostrerebbe la posizione in memoria dell'oggetto:

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

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

Aggiungi un altro metodo magico per la lunghezza:

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))   # Chiama __len__ automaticamente

Risultato:

350

Punto chiave: i metodi magici iniziano e terminano con doppie sottolineature (__method__) e vengono chiamati automaticamente da Python. Permettono ai tuoi oggetti di funzionare con funzioni integrate come str(), len() e gli operatori, rendendo le tue classi più Pythonic e intuitive da usare.

challenge icon

Sfida

Facile

In questa sfida implementerai una classe Counter con metodi magici.

  • counter.py - Questo è il file da modificare, che contiene commenti TODO per guidare l’implementazione
  • driver.py - Contiene numerosi casi di test

Implementa la classe Counter in counter.py e i casi di test in driver.py seguendo i commenti TODO. La classe dovrebbe supportare l’inizializzazione con valori facoltativi, la rappresentazione come stringa e le operazioni di addizione.

Provalo tu

# TODO: importa la classe Counter da counter.py
# Usa il formato: from counter import Counter

# Gestore completo dei casi di test
test_case = input()

if test_case == "init_test":
    # TODO: verifica l'inizializzazione con il valore predefinito
    # Crea un contatore senza argomenti e stampalo
    # Output atteso: "Count: 0"
    pass

elif test_case == "init_with_value":
    # TODO: verifica l'inizializzazione con un valore specifico
    # Crea un contatore con valore iniziale 10 e stampalo
    # Nota: print() chiama implicitamente __str__, ma qui ci concentriamo sulla verifica di __init__
    # Output atteso: "Count: 10"
    pass


elif test_case == "addition":
    # TODO: verifica l'operazione di addizione
    # Crea un contatore con valore 3, aggiungigli 7 e stampa il risultato
    # Output atteso: "Count: 10"
    pass

elif test_case == "chained_addition":
    # TODO: verifica le operazioni di addizione concatenate
    # Crea un contatore con valore 1, aggiungi 2, poi aggiungi 3 al risultato e stampalo
    # Output atteso: "Count: 6"
    pass

elif test_case == "negative_values":
    # TODO: Verifica il comportamento con valori negativi
    # Crea un contatore con valore -5 e stampalo
    # Poi aggiungi -3 e stampa il risultato
    # Output attesi: "Count: -5" e "Count: -8"
    pass

elif test_case == "zero_value":
    # TODO: Verifica il comportamento con valori pari a zero
    # Crea un contatore con valore 0, aggiungi 0 e stampa il risultato
    # Output atteso: "Count: 0"
    pass

elif test_case == "large_values":
    # TODO: Verifica il comportamento con valori elevati
    # Crea un contatore con valore 1000000 e aggiungi 9000000
    # Output atteso: "Count: 10000000"
    pass

elif test_case == "multiple_counters":
    # TODO: Verifica l'interazione tra più contatori
    # Crea counter1 con valore 5 e counter2 con valore 10
    # Stampa entrambi i contatori
    # Output attesi: "Count: 5" e "Count: 10"
    pass

elif test_case == "type_validation":
    # TODO: Verifica l'addizione di tipi diversi
    # Prova ad aggiungere un float (2.5) a un contatore con valore 5
    # Output atteso: "Count: 7.5"
    pass
quiz iconMettiti alla prova

Questa lezione include un breve quiz. Inizia la lezione per rispondere e tenere traccia dei tuoi progressi.

Tutte le lezioni di Programmazione orientata agli oggetti

Esercitati da solo: Compilatore Python online