Héritage - Création de sous-classe
MOYEN
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.
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:
- super().__init__(first, last, pay) est une manière de dire: Utilise le constructeur de la classe mère dans celui de Engineer.
- 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.
super().__init__(first, last, pay) <=> Employee().__init__(first, last, pay) |
Désormais, je vais vous montrez 2 fonctions intégrées à Python:
- isinstance(arg1, arg2)
- 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 . |