Sovrascrittura dei metodi
Fa parte della sezione Programmazione orientata agli oggetti del percorso Python di Coddy. Lezione 19 di 64.
L'override dei metodi consente a una classe figlia di fornire una propria implementazione di un metodo già presente nella classe genitore.
Ecco un esempio di una classe padre con metodi:
class Animal:
def __init__(self, name):
self.name = name
def make_sound(self):
print("Some generic animal sound")
def info(self):
print(f"I am {self.name}")Crea una classe figlia che esegue l'override di un metodo:
class Dog(Animal):
def make_sound(self):
print("Woof! Woof!") # Sovrascrive il metodo della classe genitoreIl metodo make_sound in Dog sostituisce quello di Animal, ma info viene ancora ereditato senza modifiche.
Crea istanze e testa i metodi:
animal = Animal("Generic Animal")
dog = Dog("Buddy")Chiama il metodo sovrascritto:
animal.make_sound()
dog.make_sound()Chiama il metodo non sovrascritto:
animal.info()
dog.info()Output:
Some generic animal sound
Woof! Woof!
I am Generic Animal
I am BuddyPuoi sovrascrivere qualsiasi metodo ereditato:
class Cat(Animal):
def make_sound(self):
print("Meow!")
def info(self):
print(f"I am {self.name}, a sneaky cat")
cat = Cat("Whiskers")
cat.make_sound()
cat.info()Output:
Meow!
I am Whiskers, a sneaky catPunto chiave: l'override dei metodi consente alle classi figlie di personalizzare il comportamento ereditato. Ti basta definire un metodo con lo stesso nome nella classe figlia. Verrà utilizzata la versione della classe figlia al posto di quella della classe genitore.
Sfida
MedioIn questa sfida implementerai una gerarchia di forme.
shape.py- Contiene la classe genitoreShapecon l'attributocolore i metodicircle.py- Contiene la classeCircleche eredita daShapesquare.py- Contiene la classeSquareche eredita daShape
Ogni file contiene commenti TODO dettagliati che ti guideranno passo dopo passo nell'implementazione.
Provalo tu
from shape import Shape
from circle import Circle
from square import Square
# Gestore dei casi di test
test_case = input()
if test_case == "base_shape":
# Verifica la classe base Shape
shape = Shape("green")
print(f"Color: {shape.color}")
print(f"Area: {shape.area()}")
print("Describe output:")
shape.describe()
elif test_case == "circle_basics":
# Verifica la creazione di Circle e i suoi metodi di base
circle = Circle("red", 5)
print(f"Color: {circle.color}")
print(f"Radius: {circle.radius}")
print(f"Area (rounded): {round(circle.area(), 2)}")
print("Describe output:")
circle.describe()
elif test_case == "square_basics":
# Verifica la creazione di Square e i suoi metodi di base
square = Square("blue", 4)
print(f"Color: {square.color}")
print(f"Side length: {square.side_length}")
print(f"Area: {square.area()}")
print("Describe output:")
square.describe()
elif test_case == "various_sizes":
# Verifica più istanze con dimensioni diverse
shapes = [
Circle("yellow", 2),
Circle("orange", 7.5),
Square("purple", 3),
Square("black", 10)
]
for i, shape in enumerate(shapes, 1):
print(f"Shape {i}:")
shape.describe()
print(f"Area: {round(shape.area(), 2)}")
print() # Riga vuota per migliorare la leggibilità
elif test_case == "shape_polymorphism":
# Verifica il comportamento polimorfico con un elenco di forme
shapes = [
Shape("white"),
Circle("red", 3),
Square("blue", 4)
]
print("Polymorphic behavior demonstration:")
for shape in shapes:
shape.describe()
print(f"Area: {round(shape.area(shape_polymorphism), 2)}")
print() # Riga vuota per migliorare la leggibilità
elif test_case == "original_test_case":
# Esegui il codice di test originale della sfida
circle = Circle("red", 5)
square = Square("blue", 4)
# Verifica il metodo describe
circle.describe()
square.describe()
# Verifica il metodo area
print(f"Circle area: {circle.area()}")
print(f"Square area: {square.area()}")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