Outils pour utilisateurs

Outils du site


python:programmes:classes_heritage_exemple

Différences

Ci-dessous, les différences entre deux révisions de la page.

Lien vers cette vue comparative

Les deux révisions précédentesRévision précédente
Prochaine révision
Révision précédente
python:programmes:classes_heritage_exemple [2017/06/01 09:54] rootpython:programmes:classes_heritage_exemple [2017/06/01 11:02] (Version actuelle) root
Ligne 2: Ligne 2:
  
 <code python> <code python>
-#!/usr/bin/env python3 
-# -*- coding: utf-8 -*- 
- 
 class parent1: class parent1:
     def __init__(self):     def __init__(self):
         print("init parent1")         print("init parent1")
         self.var1 = 'myvar1'         self.var1 = 'myvar1'
 +
 +    def defParent1(self):
 +        print('defParent1')
  
     def test(self):     def test(self):
Ligne 17: Ligne 17:
         print("init parent2")         print("init parent2")
         self.var2 = 'myvar2'         self.var2 = 'myvar2'
 +
 +    def defParent2(self):
 +        print('defParent2')
  
     def test(self):     def test(self):
Ligne 25: Ligne 28:
         print("init child")         print("init child")
         # Auto-initialisation des variables de l'ensemble des classes parentes         # Auto-initialisation des variables de l'ensemble des classes parentes
-        for c in __class__.mro()[1:]:+        for c in __class__.mro()[1:-1]:
             c.__init__(self)             c.__init__(self)
 +            #exec('self.{} = c.__init__(self)'.format(c.__name__))
             # On initialise dynamiquement les variables avec le nom des parents             # On initialise dynamiquement les variables avec le nom des parents
-            for c in child.mro()[1:]: +            #for c in child.mro()[1:]: 
-                exec('self.{}=c()'.format(c.__name__))+            #    exec('self.{}=c()'.format(c.__name__))
  
     def test(self):     def test(self):
Ligne 36: Ligne 40:
         print('\n* parent1.test(self) => appelle parent1.test() sans appeler __init__() car non instanciée')         print('\n* parent1.test(self) => appelle parent1.test() sans appeler __init__() car non instanciée')
         parent1.test(self)         parent1.test(self)
-        +
         print("\n* parent1().test() => appelle parent1.__init__, puis la méthode test() de la classe parent1, mais n'initialise pas la variable var1")         print("\n* parent1().test() => appelle parent1.__init__, puis la méthode test() de la classe parent1, mais n'initialise pas la variable var1")
         parent1().test()         parent1().test()
-        +
         print("\n* parent2().test() => appelle parent2.__init__(), puis la méthode test() de la classe parent2, mais n'initialise pas la variable var2")         print("\n* parent2().test() => appelle parent2.__init__(), puis la méthode test() de la classe parent2, mais n'initialise pas la variable var2")
         parent2().test()         parent2().test()
-        +
         print('\n* super().test() => appelle la méthode test() de la classe parent1 sans __init__()')         print('\n* super().test() => appelle la méthode test() de la classe parent1 sans __init__()')
         super().test()         super().test()
-         + 
-        print('\n* super().__init__() => appelle __init__() de la fonction parent1 sans __init__() et initialise la variable var1 à myvar1')+        print('\n* super().__init__() => appelle __init__() de la classe parent1 sans __init__() et initialise la variable var1 à myvar1')
         super().__init__()         super().__init__()
-        + 
 +        print('\n* super(parent1, self).__init__() => appelle __init__() de la classe parent2 car on demande à super de sauter parent1'
 +        super(parent1, self).__init__() 
         print('\n* parent1.__init__(self) => appelle parent1.__init__() et initialise la variable var1 à myvar1')         print('\n* parent1.__init__(self) => appelle parent1.__init__() et initialise la variable var1 à myvar1')
         parent1.__init__(self)         parent1.__init__(self)
-        +
         print('\n* parent2.__init__(self) => appelle parent2.__init__() et initialise la variable var2 à myvar2')         print('\n* parent2.__init__(self) => appelle parent2.__init__() et initialise la variable var2 à myvar2')
         parent2.__init__(self)         parent2.__init__(self)
Ligne 66: Ligne 73:
     print("\n* child.mro() => affiche l'ordre d'héritage des parents si non spécifié")     print("\n* child.mro() => affiche l'ordre d'héritage des parents si non spécifié")
     print(child.mro())     print(child.mro())
-    +
     print('\n* child().test() => instancie la classe child et appelle la méthode test')     print('\n* child().test() => instancie la classe child et appelle la méthode test')
     child().test()     child().test()
Ligne 72: Ligne 79:
     print('\n* a = child() => crée une instance de la classe child dans la variable a')     print('\n* a = child() => crée une instance de la classe child dans la variable a')
     a = child()     a = child()
-     
-    print('\n* a.parent1.var1 : ' + a.parent1.var1) 
-     
-    print('\n* Appelle explicitement la méthode test() sur parent1 (rendu possible car on a créé le nom des classes enfants dynamiqudment dans __init__())') 
-    a.parent1.test() 
-     
-    print('\n* a.parent2.var2 : ' + a.parent2.var2) 
  
-    print('\n* Appelle explicitement la méthode test() sur parent2 (rendu possible car on a créé le nom des classes enfants dynamiqudment dans __init__())'+    print('\n* a.defParent1() => appelle la méthode defParent1 seulement présente dans parent1'
-    a.parent2.test()+    a.defParent1() 
 + 
 +    print('\n* a.defParent2() => appelle la méthode defParent2 seulement présente dans parent2'
 +    a.defParent2() 
 + 
 +    print('\n* a.var1 : ' + a.var1) 
 +    print('\n* a.var2 : ' + a.var2) 
 + 
 +    #print('\n* a.parent1.var1 : ' + a.parent1.var1) 
 +    #print('\n* a.parent2.var2 : ' + a.parent2.var2) 
 + 
 +    #print('\n* Appelle explicitement la méthode test() sur parent1 (rendu possible car on a créé le nom des classes enfants dynamiqudment dans __init__())'
 +    #a.parent1.test() 
 + 
 +    #print('\n* Appelle explicitement la méthode test() sur parent2 (rendu possible car on a créé le nom des classes enfants dynamiqudment dans __init__())'
 +    #a.parent2.test()
 </code> </code>
python/programmes/classes_heritage_exemple.1496310859.txt.gz · Dernière modification : 2017/06/01 09:54 de root