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 SmithSenza __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__ automaticamenteRisultato:
350Punto 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.
Sfida
FacileIn questa sfida implementerai una classe Counter con metodi magici.
counter.py- Questo è il file da modificare, che contiene commenti TODO per guidare l’implementazionedriver.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"
passQuesta lezione include un breve quiz. Inizia la lezione per rispondere e tenere traccia dei tuoi progressi.
Tutte le lezioni di Programmazione orientata agli oggetti
1Fondamenti di OOP
File esterniIntroduzione a OOPClassi vs. oggettiIl parametro selfMetodiAttributiMetodo costruttore (__init__)Riepilogo - Calcolatrice semplice4Ereditarietà
Ereditarietà di baseLa funzione super()Sovrascrittura dei metodiEreditarietà multiplaOrdine di risoluzione dei metodiRiepilogo - Gerarchia dei dipendenti7Metodi speciali
Introduzione ai metodi magiciSovraccarico degli operatoriMetodi magici dei contenitoriRiepilogo - Lista personalizzata10Modelli di progettazione Parte 1
Introduzione ai modelli di progettazioneModello SingletonModello FactoryModello ObserverModello Strategy2Decoratori
Introduzione ai decoratoriDecoratore di proprietàDecoratore di metodo staticoDecoratore di metodo di classe5Polimorfismo
Ripasso dell'override dei metodiDuck typingClassi e metodi astrattiProgettazione delle interfacceRiepilogo - Calcolatore di forme8Concetti avanzati di OOP
Composizione vs ereditarietàMixinMetodi statici e di classeDecorator di classeContext manager11Pattern di progettazione - Parte 2
Pattern dei comandiPattern adattatorePattern decoratorePattern metodo templatePattern statoPattern composito3Proprietà delle classi
Variabili di istanza e di classeDecorator delle proprietàAttributi privatiRiepilogo - Gestore di conti bancari6Incapsulamento
Membri pubblici, protetti e privatiModificatori di accessoOccultamento delle informazioniDecorator delle proprietà: avanzatiRipasso - Sistema di registri degli studenti12Progetto: Gestione della biblioteca
Panoramica del progettoClassi Libro e UtenteSistema di prestitoFunzionalità di ricercaInterfaccia amministratoreTest e integrazioneEsercitati da solo: Compilatore Python online