Quand on instancie un objet d'une classe fille, ce dernier a :
On peut s'en convaincre avec l'exemple suivant :
>>> class M: ... m=1 ... >>> class F(M): ... f=0 ... >>> ex=F() >>> getattr(ex,'m'), getattr(ex,'f') (1, 0)
Cette fois-ci, supposons que les attributs d'une classe sont fixés par dans le constructeur de ladite classe :
>>> class M: ... def __init__(self): ... self.m = 1 ... >>> class F(M): ... def __init__(self): ... self.f = 0 ...
Instancions un objet de la classe fille :
>>> ex=F()
Cet objet possède bien un attribut f :
>>> getattr(ex,'f') 0
Mais, puisqu'il n'a pas été fait explicitement appel au constructeur de la classe parente, ex ne possède alors pas d'attribut m :
>>> getattr(ex,'m') Traceback (most recent call last): File "<stdin>", line 1, in <module> AttributeError: F instance has no attribute 'm'
Créons une classe Chien, qui hérite d'une classe Carnivore, elle-même étant une sous-classe de Mammifere, chaque classe ayant un attribut propre :
>>> class Mammifere: ... caract1 = "il allaite ses petits ;" ... >>> class Carnivore(Mammifere): caract2 = "il se nourrit de la chair de ses proies ;" ... >>> class Chien(Carnivore): caract3 = "son cri s'appelle aboiement ;" ...
Alors, si l'on instancie un objet de la classe Chien, il héritera des attributs de toutes les classes parentes à Chien :
>>> mirza = Chien() >>> print mirza.caract1, mirza.caract2, mirza.caract3 il allaite ses petits ; il se nourrit de la chair de ses proies ; son cri s'appelle aboiement ;
Considérons les classes suivantes :
class E: def __init__(self): self.e = 0 ... class F(E): def __init__(self): self.f = 1 ... class G(F): def __init__(self): self.g = 2
Instancions un objet de la classe G, et faisons explicitement appel au constructeur de la classe E :
>>> ex=G() >>> E.__init__(ex)
Alors l'objet ex possèdera un attribut pour chacune des classes "extrèmes" E et G :
>>> ex.g, ex.m (0, 1)
Mais aucun attribut pour la classe intermédiaire : à aucun moment, le constructeur de la classe F n'a été appelé.
>>> ex.f Traceback (most recent call last): File "<stdin>", line 1, in <module> AttributeError: G instance has no attribute 'f'