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'