Classi e metodi astratti
Fa parte della sezione Programmazione orientata agli oggetti del percorso Python di Coddy. Lezione 25 di 64.
Le classi astratte sono classi che non possono essere istanziate direttamente e contengono metodi astratti che devono essere implementati dalle sottoclassi.
Immaginala come un modulo: una classe astratta è come un modulo obbligatorio in cui alcuni campi sono richiesti (metodi astratti) e altri sono facoltativi (metodi concreti). Non puoi inviare il modulo così com’è: devi prima compilare tutti i campi richiesti. Allo stesso modo, non puoi creare istanze di una classe astratta finché tutti i metodi astratti non sono implementati in una sottoclasse.
Importa il modulo abc per creare classi astratte:
from abc import ABC, abstractmethodCrea una classe astratta con metodi astratti:
class Shape(ABC):
@abstractmethod
def area(self):
pass
@abstractmethod
def perimeter(self):
pass
def describe(self):
return "This is a shape" # Metodo concreto (ha un'implementazione)Il decoratore @abstractmethod contrassegna i metodi che le sottoclassi devono implementare: sono i «campi obbligatori» del tuo modulo. I metodi normali, come describe(), possono avere un'implementazione e vengono ereditati così come sono: sono i «campi precompilati».
Perché usare le classi astratte? Impongono un contratto. Se crei una classe Shape, stai dicendo: "ogni forma DEVE essere in grado di calcolare la propria area e il proprio perimetro". Questo previene i bug che potrebbero verificarsi se ti dimenticassi di implementare metodi fondamentali.
Prova a creare un'istanza della classe astratta:
# Questo causerà un errore:
# shape = Shape() # TypeError: Can't instantiate abstract classQuesto errore è intenzionale: è come cercare di inviare un modulo vuoto. Python sta dicendo: "Non hai ancora compilato i campi obbligatori (i metodi area e perimeter)!"
Crea una sottoclasse concreta che implementi tutti i metodi astratti:
class Circle(Shape):
def __init__(self, radius):
self.radius = radius
def area(self):
return 3.14 * self.radius ** 2
def perimeter(self):
return 2 * 3.14 * self.radiusOra abbiamo "compilato tutti i campi obbligatori": abbiamo implementato sia area() sia perimeter(). La classe Circle è ora una classe concreta completa che può essere istanziata.
Ora puoi creare istanze della classe concreta:
circle = Circle(5)
print(circle.area())
print(circle.perimeter())
print(circle.describe()) # Metodo concreto ereditatoCrea un'altra sottoclasse concreta:
class Rectangle(Shape):
def __init__(self, width, height):
self.width = width
self.height = height
def area(self):
return self.width self.height
def perimeter(self):
return 2 * (self.width + self.height)
rectangle = Rectangle(4, 6)
print(rectangle.area())
print(rectangle.perimeter())Output:
78.5
31.400000000000002
This is a shape
24
20Le classi astratte definiscono un contratto che le sottoclassi devono rispettare. Usa ABC e @abstractmethod per creare classi astratte. Le sottoclassi devono implementare tutti i metodi astratti, altrimenti saranno anch'esse astratte. Questo garantisce la coerenza e previene implementazioni incomplete.
Sfida
MedioIn questa sfida, implementerai un sistema di elaborazione dei pagamenti.
Devi completare l’implementazione in questi file:
paymentmethod.py- Classe base astratta con logica di convalidacreditcard.py- Implementazione del pagamento con carta di creditopaypal.py- Implementazione del pagamento con PayPal
Segui i commenti TODO in ogni file per implementare le funzionalità richieste. I commenti ti guideranno passo dopo passo nella creazione di metodi astratti, nell’implementazione di sottoclassi concrete e nella definizione delle corrette relazioni di importazione tra i file.
Il file driver.py contiene casi di test che verificheranno che la tua implementazione funzioni correttamente, elaborando diversi scenari di pagamento e visualizzando i dettagli appropriati per ogni metodo di pagamento.
Provalo tu
from creditcard import CreditCard
from paypal import PayPal
# Testa le implementazioni - NON MODIFICARE QUESTO CODICE DI TEST
cc = CreditCard("1234567890123456")
pp = PayPal("user@example.com")
# Elabora i pagamenti validi
if cc.validate(100):
print(cc.process_payment(100))
print(cc.payment_details())
if pp.validate(200):
print(pp.process_payment(200))
print(pp.payment_details())
# Prova un importo non valido
if not pp.validate(0):
print("Invalid payment amount")
# Questo genererebbe un errore se venisse rimosso il commento:
# pm = PaymentMethod() # Non è possibile istanziare una classe astrattaQuesta 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