Héritage - Création de sous-classe

 

MOYEN

  1. isinstance()
  2. issubclass()

Si nous reprenons le contexte précédent, nous pouvons dire qu’il y a différent types d’employés telle que des ingénieurs, des managers …

Puisqu’ils partagent la même caractéristique, c’est-à-dire être des Employee mais quand même temps possèdent leurs propres particularités, au lieu de créer entièrement une nouvelle classe, nous allons leur faire hériter des caractéristiques de la classe mère Employee.

Nous allons tout d'abord redéfinir la classe Employee.
class Employee:
    #Variables de classe
    raise_amount = 1.04
    nb_employee = 0

    #Constructeur
    def __init__(self, firstname, lastname, pay):
        #Attributs
        self.firstname = firstname
        self.lastname = lastname
        self.email  = firstname + '.' + lastname + '@company.com'
        self.pay = pay
        
        Employee.nb_employee += 1
        
    #Méthodes ordinaires
    def fullname(self):
        return self.firstname  + ' ' + self.lastname
    
    def apply_raise(self):
        self.pay = int(self.pay * self.raise_amount) 
    
    #Méthodes de classe
    @classmethod
    def set_raise_amount(cls, amount):
        cls.raise_amount = amount

    @classmethod
    def from_string(cls, emp_str):
        first, last, pay = emp_str.split('-')
        return cls(first, last, pay)

    #Méthodes statiques
    def is_adult(age):
        if age > 18:
            return age
        
emp_1 = Employee('test', 'user', '50000')
Voici la sous-classe Engineer.
class Engineer(Employee):
    pass
La ligne au-dessus signifie : "Nous donnons les caractéristiques de la classe Employee à la sous-classe Engineer".

Désormais, nous voulons que chaque ingénieur indique leur langage de programmation favoris.
class Engineer(Employee):
    raise_amt = 1.10

    def __init__(self, first, last, pay, prog_lang):
        super().__init__(first, last, pay)
        self.prog_lang = prog_lang

eng_1 = Engineer("Ferdi", "Mom", "70000", "python")
eng_2 = Engineer("Test", "User", "80000", "C")

print(eng_1.fullname())
print(eng_1.prog_lang)
>>>
Ferdi Mom
python
Plusieurs choses à dire ici:
  1. super().__init__(first, last, pay) est une manière de dire: Utilise le constructeur de la classe mère dans celui de Engineer.
  2. Nous avions pu utiliser la méthode fullname qui n'existe que dans Employee. C'est parce que Engineer a hérité des caractéristiques de Employee.
Remarque:
super().__init__(first, last, pay) <=> Employee().__init__(first, last, pay)

Désormais, je vais vous montrez 2 fonctions intégrées à Python:

  1. isinstance(arg1, arg2)
  2. issubclass(arg1, arg2)

isinstance()

Cette fonction vérifie si arg1 est une instance de arg2.
print(isinstance(eng_1, Engineer))
>>> True


print(isinstance(eng_1, Employee))
```python
>>> True
print(isinstance(emp_1, Engineer))
>>> False

issubclass()

Cette fonction vérifie si arg1 est une sous-classe de arg2.
print(issubclass(Engineer, Employee))
>>> True


print(issubclass(Employee, Engineer)) 
>>> False

Pour résumer:

- L' héritage permet de partager les caractéristiques d'une classe mère à d'autres classes qu'on appele sous-classe .
- super().__init__(first, last, pay) permet d'utiliser le constructeur de la classe mère dans la sous-classe.
- isintance(arg1, arg2) permet de savoir si arg1 est une instance de arg2 .
- issubclass(arg1, arg2)*__ permet de savoir si arg1__ est une sous-classe de arg2 .