Jul 03, 2024

Wiki

Python

Aide

edit SideBar

Search

Heritage Des Attributs Des Classes Parentes

La base

Quand on instancie un objet d'une classe fille, ce dernier a :

  • les attributs de sa classe d'instanciation,
  • les attributs des classes parentes de sa classe d'instanciation.

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)

Cas où les attributs se trouvent dans les constructeurs

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'

Exemples d'une hiérarchie à trois classes

Exemple de base

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 ;

Appel explicite du constructeur d'une superclasse

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'

Page Actions

Recent Changes

Group & Page

Back Links