13.3 Méthodes
Objectifs d'apprentissage
À la fin de cette section, vous devriez être en mesure de :
- Écrire des méthodes redéfinies pour modifier le comportement des méthodes héritées.
- Utiliser
super()pour accéder aux méthodes d'une superclasse. - Identifier les applications du polymorphisme dans l'utilisation des méthodes et des fonctions.
Redéfinition de méthodes
Parfois, un programmeur souhaite modifier les fonctions dont hérite une sous-classe. Mint est une sous-classe qui possède les mêmes fonctionnalités que Plant, à l'exception d'une seule fonction. Une sous-classe peut redéfinir (override) une méthode de superclasse en définissant une méthode portant le même nom que celle de la superclasse.
Concepts en pratique
Redéfinition de méthodes
super()
super() est une méthode spéciale qui fournit un objet intermédiaire donnant accès à la superclasse depuis une sous-classe. super() est couramment utilisée pour appeler des méthodes de superclasse depuis une sous-classe. super() est couramment utilisée dans le __init__() d'une sous-classe pour assigner des attributs d'instance hérités. Ex. : super().__init__().
Concepts en pratique
Utiliser super()
Considérez le programme suivant.
1 | class Polygon: |
2 | def __init__(self, num_sides=3): |
3 | self.num_sides = num_sides |
4 | |
5 | class Rectangle(Polygon): |
6 | def __init__(self, ln=1, wd=1): |
7 | super().__init__(4) |
8 | self.length = ln |
9 | self.width = wd |
10 | |
11 | class Square(Rectangle): |
12 | def __init__(self, side=1): |
13 | super().__init__(side, side) |
14 | self.side = side |
15 | |
16 | sq_1 = Square(5) |
17 | print(sq_1.num_sides) |
Polymorphisme
Le polymorphisme (polymorphism) est le concept selon lequel une entité peut prendre plusieurs formes. En programmation, un même nom peut être utilisé pour de multiples fonctionnalités. Dans le cadre de l'héritage, le polymorphisme est le fondement de la redéfinition de méthodes, puisque plusieurs méthodes partagent le même nom.
Exemple 13.1
Polymorphisme et héritage
Le nom display() correspond à plusieurs méthodes. Le type de classe de l'objet appelant détermine quelle méthode display() est exécutée.
class Plant:
def display(self):
print("I'm a plant")
class Mint(Plant):
def display(self):
print("I'm a mint")
class Lavender(Mint):
def display(self):
print("I'm a lavender")
mint_1 = Mint()
mint_1.display()
lavender_1 = Lavender()
lavender_1.display()
La sortie du code est :
I'm a mint
I'm a lavender
Le polymorphisme peut également être utilisé avec des méthodes de classes sans lien de parenté. Le type de classe de l'objet appelant détermine la méthode exécutée.
Exemple 13.2
Polymorphisme et méthodes
Tax et ContractTax sont des classes indépendantes qui définissent chacune calc_tax(). calc_tax() n'est pas redéfinie car ContractTax n'hérite pas de Tax.
class Tax:
def __init__(self, value):
self.value = value
def calc_tax(self):
print("Calculating tax")
total = 0.10 * self.value # To replace with calculation
return total
class ContractTax:
def __init__(self, value):
self.value = value
def calc_tax(self):
print("Calculating contracts tax")
total = 0.15 * self.value # To replace with calculation
return total
my_tax = ContractTax(value=1000) # Replace 1000 with any value
result = my_tax.calc_tax()
print(f"Total tax: ${result}")
La sortie du code est :
Calculating contracts tax
Total tax: $150.00
Le polymorphisme permet d'appeler des méthodes avec différents types de paramètres. De nombreux opérateurs et fonctions intégrées possèdent cette propriété.
Exemple 13.3
Polymorphisme et fonctions
len() peut être appelée avec plusieurs types, notamment des listes et des chaînes de caractères.
tree_list = ["ash", "hazel", "oak", "yew"]
tree_1 = tree_list[0]
print(len(tree_list))
print(len(tree_1))
La sortie du code est :
4
3
Concepts en pratique
Le polymorphisme en pratique
À vous d'essayer
Redéfinition de méthodes
Étant donné la classe Pet, créez une classe Bird héritant de Pet et une classe Finch héritant de Bird. Redéfinissez la méthode display() dans Bird et Finch de sorte que la sortie du programme soit :
Pet type: Bird
Bird type: Finch
À vous d'essayer
Utiliser super()
Étant donné la classe Employee, créez une classe Developer héritant de Employee avec les méthodes __init__() et print_info() de telle sorte que :
__init__()
- Utilise
super()pour appeler la méthode__init__()deEmployee'afin d'initialisere_idethire_year. - Assigne à
lang_xple paramètre de type listelang_xp.
print_info()
- Utilise
super()pour affichere_idethire_year. - Affiche
"Language(s):"suivi delang_xp.