Méthodes

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.

Faites le point

Redéfinir une méthode de superclasse

Concepts en pratique

Redéfinition de méthodes

1.
Supposons qu'un programmeur fasse hériter la classe ContractTax de la classe Tax et souhaite redéfinir la méthode de Tax's calc_tax(). Que doit faire le programmeur ?
  1. Définir une autre méthode calc_tax() dans Tax.
  2. Définir une méthode calc_tax() dans ContractTax.
  3. Définir une fonction qui prend une instance de ContractTax.
2.
Quelle est l'erreur dans le programme qui tente de redéfinir calc_tax() pour ContractTaxDE ?
class Tax:
  def calc_tax(self):
    print('Calculating tax')

class ContractTax(Tax):
  def calc_tax(self):
    print('Calculating contract tax')

class ContractTaxDE(ContractTax):
  def calc_tax():
    print('Calculating German contract tax')

my_tax = ContractTaxDE()
my_tax.calc_tax()
  1. ContractTaxDE doit hériter de Tax, et non de ContractTax.
  2. Dans ContractTaxDE's, la définition de calc_tax() ne comporte pas de paramètre.
  3. ContractTaxDE ne peut pas redéfinir calc_tax() puisque ContractTax l'a déjà fait.
3.
Le programme suivant ne redéfinit pas calc_tax(). Pourquoi ?
class Tax:
  def calc_tax(self):
    print('Calculating tax')
    total = 0 # To replace with calculation
    return total

class ContractTax:
  def calc_tax(self):
    print('Calculating contract tax')
    total = 0 # To replace with calculation
    return total

my_tax = ContractTax()
my_tax.calc_tax()
  1. Une méthode redéfinie ne peut pas renvoyer de valeur.
  2. Tax ne spécifie pas que calc_tax() peut être redéfinie.
  3. ContractTax n'hérite pas de Tax.

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__().

Faites le point

Utiliser super() pour appeler la méthode __init__() de la superclasse

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)
4.
La ligne 16 s'exécute et pour Square, __init__() est appelée à la ligne 12. La ligne 13 s'exécute et le __init__() de la superclasse est appelé. Vers quelle ligne le flux de contrôle se déplace-t-il ensuite ?
  1. 2
  2. 6
  3. 14
5.
La ligne suivante s'exécute. Vers quelle ligne le flux de contrôle se déplace-t-il ensuite ?
  1. 2
  2. 6
  3. 14
6.
L'appel de méthode se termine. Les lignes 8 et 9 s'exécutent pour initialiser length et width, et pour Rectangle's le __init__() se termine. Vers quelle ligne le flux de contrôle se déplace-t-il ensuite ?
  1. 12
  2. 14
  3. 17
7.
Dans Square's, __init__() se termine et le flux de contrôle passe à la ligne 17. Quelle est la sortie ?
  1. 3
  2. 4
  3. 5

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

8.
Considérez l'exemple. Quelle est la sortie ?
class Polygon:
  def print_type(self):
    print("Polygon type")

class Rectangle(Polygon):
  def print_type(self):
    print("Rectangle type")

class Square(Rectangle):
  def print_type(self):
    print("Square type")

sq_1 = Square()
sq_1.print_type()
  1. Polygon type
  2. Rectangle type
  3. Square type
9.
Lequel est un exemple de polymorphisme pour l'opérateur de multiplication ?
  1. x = 3 * 4
    y = 3 * "la"
    
  2. x = 3 * 4
    y = str(x)
    
  3. x = 3 * 4
    y = x * x
    

À 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__() de Employee' afin d'initialiser e_id et hire_year.
  • Assigne à lang_xp le paramètre de type liste lang_xp.

print_info()

  • Utilise super() pour afficher e_id et hire_year.
  • Affiche "Language(s):" suivi de lang_xp.