```python= # Créé par B.BERTRAND, le 17/10/2022 en Python 3.7 #question a : class Tranche: #constructeur: def __init__(self,t,debut,fin): self.t=t self.debut=debut self.fin=fin self.tranche_a=[] for i in range(debut,fin): self.tranche_a+=[t[i]] #methodes: def longueur(self): # retourne la longueur de la liste return self.fin-self.debut+1 def getitem(self,position): # retourne la valeur du n-ième élément return self.tranche_a[position] def setitem(self,position,valeur): # changer la valeur du n-ième élément self.tranche_a[position]=valeur #question b et c : class Tranche2: #constructeur: def __init__(self,t,debut,fin): self.t=t self.debut=debut self.fin=fin self.tranche_2=[] for i in range(debut,fin): self.tranche_2+=[t[i]] #methodes: def __len__(self): #retourne la longueur de la liste return self.fin-self.debut+1 def __getitem__(self,position): #retourne la valeur du n-ième élément return self.tranche_2[position] def __setitem__(self,position,valeur): #change la valeur du n-ième élément self.tranche_2[position]=valeur #programme principal #question a : print("question a :") test1=Tranche([1,2,3,4,5],2,4) print(test1.longueur()) print(test1.getitem(1)) test1.setitem(1,7) print(test1.getitem(1)) #question b : print("////////////////////") print("question b :") test2=Tranche2([1,2,3,4,5],2,4) print(len(test2)) print(test2[1]) test2[1]=7 print(test2[1]) #question c : print("////////////////////") print("question c :") print(isinstance(test2,list)) #on verifie si b est un tableau tranche_test=Tranche2(test2,0,1) #on crée une tranche à partir de la tranche b print(len(tranche_test)) print(test2[0]) print(test2[1]) print(isinstance(tranche_test,list)) #on verifie si u est un tableau, ce n'est pas le cas ``` **travail de recherches :** **1) Qu’est-ce que l’héritage en POO ?** En programmation orientée objet, “hériter” signifie “avoir également accès à”. Lorsqu’on dit qu’un objet “hérite” des méthodes de la classe qui l’a défini, cela signifie que l’objet peut utiliser ces méthodes; qu’il y a accès. La notion d’héritage va être particulièrement intéressante lorsqu’on va l’implémenter entre deux classes. En Python, nous allons en effet pouvoir créer des “sous-classes” ou des classes “enfants” à partir de classes de base ou classes “parentes”. **2) Comment représente-t-on l’héritage en UML ?** **3) Schématiser les liens d’hérédité relatifs aux classes décrites dans les lignes suivantes :** **Comment déclarer l’héritage en Python :** Python définit deux fonctions primitives pour gérer l'héritage : utilisez isinstance() pour tester le type d'une instance : isinstance(obj, int) renvoie True seulement si obj.__class__ est égal à int ou à une autre classe dérivée de int ; utilisez issubclass() pour tester l'héritage d'une classe : issubclass(bool, int) renvoie True car la classe bool est une sous-classe de int. Cependant, issubclass(float, int) renvoie False car float n'est pas une sous-classe de int. **En utilisant les informations recueillies précédemment, implémenter votre diagramme d’objet.** **Qu’est ce qu’un mutateur ?** les mutateurs (en anglais mutator) qui modifient l’état d’un objet, donc les valeurs de certains de ses attributs. **Qu’est ce qu’un accesseur ?** Les accesseurs sont des méthodes qui permettent de retourner la valeur d’un attribut. **Quelle est la convention d’écriture utilisée pour définir les accesseurs ?** **Quelle est la convention d’écriture utilisée pour définir les mutateurs ?** **Au sein des classes implémentées précédemment, mettez en place les accesseurs et les mutateurs ?**