Redéfinition de méthode
Fait partie de la section Object Oriented Programming du Journey Python de Coddy — leçon 19 sur 64.
La redéfinition de méthode permet à une classe enfant de fournir sa propre implémentation d'une méthode qui existe déjà dans la classe parente.
Voici un exemple d'une classe parente avec des méthodes :
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}")Créez une classe enfant qui surcharge une méthode :
class Dog(Animal):
def make_sound(self):
print("Woof! Woof!") # Surcharge la méthode parenteLa méthode make_sound dans Dog remplace celle de Animal, mais info est toujours héritée sans modification.
Créez des instances et testez les méthodes :
animal = Animal("Generic Animal")
dog = Dog("Buddy")Appelez la méthode redéfinie :
animal.make_sound()
dog.make_sound()Appelez la méthode non redéfinie :
animal.info()
dog.info()Sortie :
Some generic animal sound
Woof! Woof!
I am Generic Animal
I am BuddyVous pouvez surcharger n'importe quelle méthode héritée :
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()Sortie :
Meow!
I am Whiskers, a sneaky catPoint clé : La redéfinition de méthode permet aux classes enfants de personnaliser le comportement hérité. Il suffit de définir une méthode avec le même nom dans la classe enfant. La version de l'enfant sera utilisée à la place de celle du parent.
Défi
MoyenDans ce défi, vous allez implémenter une hiérarchie de formes.
shape.py- Contient la classe parenteShapeavec l'attributcoloret des méthodescircle.py- Contient la classeCirclequi hérite deShapesquare.py- Contient la classeSquarequi hérite deShape
Chaque fichier contient des commentaires TODO détaillés qui vous guideront étape par étape tout au long de l'implémentation.
Aide-mémoire
La redéfinition de méthode (method overriding) permet à une classe enfant de fournir sa propre implémentation d'une méthode qui existe déjà dans la classe parente.
Exemple de classe parente :
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}")Classe enfant redéfinissant une méthode :
class Dog(Animal):
def make_sound(self):
print("Woof! Woof!") # Redéfinir la méthode parenteLa méthode make_sound dans Dog remplace celle d'Animal, mais info est toujours héritée sans modification.
Vous pouvez redéfinir plusieurs méthodes :
class Cat(Animal):
def make_sound(self):
print("Meow!")
def info(self):
print(f"I am {self.name}, a sneaky cat")Point clé : Définissez simplement une méthode avec le même nom dans la classe enfant. La version de l'enfant sera utilisée à la place de celle du parent.
Essayez vous-même
from shape import Shape
from circle import Circle
from square import Square
# Gestionnaire de cas de test
test_case = input()
if test_case == "base_shape":
# Tester la classe de 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":
# Tester la création de Circle et les méthodes de 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":
# Tester la création de Square et les méthodes de 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":
# Tester plusieurs instances avec des dimensions différentes
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() # Ligne vide pour la lisibilité
elif test_case == "shape_polymorphism":
# Tester le comportement polymorphe avec une liste de formes
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() # Ligne vide pour la lisibilité
elif test_case == "original_test_case":
# Exécuter le code de test original du défi
circle = Circle("red", 5)
square = Square("blue", 4)
# Tester la méthode describe
circle.describe()
square.describe()
# Tester la méthode area
print(f"Circle area: {circle.area()}")
print(f"Square area: {square.area()}")Cette leçon comprend un petit quiz. Commencez la leçon pour y répondre et suivre votre progression.
Toutes les leçons de Object Oriented Programming
1Les fondamentaux de la POO
Fichiers externesIntroduction à la POOClasses vs ObjetsLe paramètre selfMéthodesAttributsMéthode constructeur (__init__)Récapitulatif - Calculatrice simple4Héritage
Héritage de baseLa fonction super()Redéfinition de méthodeHéritage multipleOrdre de résolution des méthodesRécapitulatif - Hiérarchie des employés7Méthodes spéciales
Introduction aux méthodes magiquesSurcharge d'opérateursMéthodes magiques de conteneurRécapitulatif - Liste personnalisée10Patrons de conception, Partie 1
Introduction aux patrons de conceptionPatron SingletonPatron FactoryPatron ObserverPatron Strategy2Décorateurs
Introduction aux décorateursDécorateur de propriétéDécorateur de méthode statiqueDécorateur de méthode de classe5Polymorphisme
Retour sur la redéfinition de méthodeDuck TypingClasses et méthodes abstraitesConception d'interfacesRécapitulatif - Calculateur de formes8Concepts avancés de la POO
Composition vs HéritageMixinsMéthodes statiques et de classeDécorateurs de classeGestionnaires de contexte11Patrons de conception, Partie 2
Patron CommandePatron AdaptateurPatron DécorateurPatron Méthode TemplatePatron ÉtatPatron Composite3Propriétés de classe
Variables d'instance vs variables de classeDécorateurs de propriétéAttributs privésRécapitulatif - Gestionnaire de compte bancaire