Duck typing
Fa parte della sezione Programmazione orientata agli oggetti del percorso Python di Coddy. Lezione 24 di 64.
Il duck typing si concentra su ciò che un oggetto può fare, non su ciò che è. Se un oggetto dispone dei metodi di cui hai bisogno, puoi usarlo, indipendentemente dalla sua classe.
Ecco due classi non correlate con gli stessi metodi:
class Duck:
def swim(self):
return "Duck swimming"
def quack(self):
return "Quack!"
class Person:
def swim(self):
return "Person swimming"
def quack(self):
return "Person imitating a duck: Quack!"Nota che Duck e Person non ereditano dalla stessa classe genitore, ma hanno entrambi i metodi swim() e quack().
Crea una funzione che funzioni con qualsiasi oggetto «simile a un'anatra»:
def make_it_swim_and_quack(duck_like_object):
print(duck_like_object.swim())
print(duck_like_object.quack())A questa funzione non interessa il tipo dell'oggetto: le interessa solo che l'oggetto abbia i metodi richiesti.
Usa la funzione con entrambe le classi:
make_it_swim_and_quack(Duck())
make_it_swim_and_quack(Person())Output:
Duck swimming
Quack!
Person swimming
Person imitating a duck: Quack!Aggiungi un'altra classe "simile a un'anatra":
class Robot:
def swim(self):
return "Robot swimming with propellers"
def quack(self):
return "Robot sound: BEEP BEEP!"
make_it_swim_and_quack(Robot())Output:
Robot swimming with propellers
Robot sound: BEEP BEEP!Punto chiave: il duck typing consente il polimorfismo senza ereditarietà. Se un oggetto dispone dei metodi di cui hai bisogno, puoi usarlo. Questo rende il codice Python flessibile e segue il principio «è più facile chiedere perdono che permesso».
Sfida
MedioIn questa sfida, implementerai un sistema che dimostra il duck typing con diversi oggetti simili a file:
textfile.py: implementa la classeTextFilecon i metodiread()ewrite(data)database.py: implementa la classeDatabasecon firme dei metodi corrispondentinetworkresource.py: implementa la classeNetworkResourcecon firme dei metodi corrispondentidriver.py- implementa i casi di test che verificheranno che la tua implementazione funzioni correttamente
Ogni file contiene commenti TODO dettagliati che guidano la tua implementazione.
Provalo tu
# TODO: importa la classe TextFile da textfile.py
# TODO: importa la classe Database da database.py
# TODO: importa la classe NetworkResource da networkresource.py
def process_data(data_source, data):
# TODO: chiama il metodo read() su data_source e stampa il risultato
# TODO: chiama il metodo write(data) su data_source e stampa il risultato
pass
# Test con diverse sorgenti di dati - NON MODIFICARE QUESTO CODICE DI TEST
text_file = TextFile()
database = Database()
network = NetworkResource()
print("Processing text file:")
process_data(text_file, "Hello, world!")
print("\
Processing database:")
process_data(database, "User record")
print("\
Processing network resource:")
process_data(network, "GET request")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
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