Chapitre 13
13.1 Notions de base de l'héritage
2.
b.
Une cuisine possède un congélateur, donc une classe
Kitchen contiendrait une instance de Freezer. Une relation « possède-un » est également appelée composition.
5.
a.
Dériver
CarryOn de Luggage est spécifié dans la définition de classe de CarryOn'. Ex. :
class CarryOn(Luggage):
. Les instances d'une sous-classe, comme CarryOn, sont créées comme d'autres classes et ne requièrent pas le nom de la classe de base.
6.
c.
Une instance de
SubClass a accès à func_1(), héritée de SuperClass, ainsi qu'à func_2(), une méthode de SubClass.
7.
a.
Une instance de
SuperClass a accès à la méthode de SuperClass' func_1(), mais n'a accès à rien dans SubClass, y compris func_2().
13.2 Accès aux attributs
1.
b.
dev_1 est le deuxième Employee créé. Ainsi, dev_1 est le deuxième objet à appeler Employee.__init__(), et dev_1.e_id reçoit la valeur
2
.
2.
a.
La méthode de
SubClass' __init__() n'est pas explicitement définie, donc celle de SuperClass', __init__(), est exécutée.
4.
b.
dev_display() est une méthode de Developer qui accède, pour dev_1', à l'attribut d'instance lang_xp.
5.
c.
dev_display() est une méthode de Developer. emp_1 n'est pas une instance de Developer, donc emp_1 ne peut pas accéder à dev_display().
6.
a.
Les attributs d'instance hérités d'
Employee, la superclasse, sont accessibles de la même manière que les attributs d'instance de la sous-classe Developer'.
13.3 Méthodes
1.
b.
La redéfinition consiste à définir une méthode de sous-classe qui porte le même nom que la méthode de la superclasse.
3.
c.
La définition de la classe n'indique pas d'héritage. La définition devrait être
class ContractTax(Tax):.
4.
b.
La superclasse de
Square est Rectangle. La méthode de Rectangle __init__() est appelée à la ligne 6.
5.
a.
super().__init__(4) appelle la méthode __init__() de la superclasse de Rectangle', Polygon. L'exécution passe à la ligne 3, et num_sides est initialisé avec 4.
7.
b.
La méthode de
Rectangle' __init__() appelle toujours celle de Polygon', __init__(), avec num_sides=4.
9.
a.
L'opérateur * peut être utilisé avec des opérandes entiers ainsi qu'avec des chaînes de caractères et d'autres types.
13.4 Héritage hiérarchique
2.
b.
Employee serait une superclasse appropriée pour
Developer et SalesRep. Developer et SalesRep ne sont pas directement liés.
3.
a.
B(2) se résout en B(2, 0), car b_attr a une valeur par défaut de
0
. a_attr reçoit la valeur
2
.
4.
b.
c_inst a accès à l'attribut d'instance de C', c_attr, ainsi qu'à l'attribut hérité de A, a_attr.
5.
b.
D hérite de B, donc d_inst hérite de b_attr. B hérite également de A, donc d_inst hérite de d_attr.
13.5 Héritage multiple et classes mixin
2.
b.
Aucun argument n'est transmis à la méthode de
C' __init__() pour c_attr, donc c_attr reçoit la valeur par défaut,
20
.
5.
b.
eat() peut être déplacée dans une classe mixin incluse dans la liste d'héritage de Pitcher' et de VenusFlyTrap'.
6.
b.
Une bonne pratique consiste à terminer le nom d'une classe mixin par
"Mixin"
afin d'identifier le rôle de la classe. L'implémentation finale est :
class Plant:
def photosynth(self):
print("Photosynthesizing")
class CarnivMixin:
def eat(self):
print("Eating")
class Rose(Plant):
pass
class Pitcher(Plant, CarnivMixin):
pass
class VenusFlyTrap(Plant, CarnivMixin)
pass