Outils pour utilisateurs

Outils du site


python:programmes:classes_heritage_exemple

Exemple d'héritage de classe

class parent1:
    def __init__(self):
        print("init parent1")
        self.var1 = 'myvar1'
 
    def defParent1(self):
        print('defParent1')
 
    def test(self):
        print('parent1')
 
class parent2:
    def __init__(self):
        print("init parent2")
        self.var2 = 'myvar2'
 
    def defParent2(self):
        print('defParent2')
 
    def test(self):
        print('parent2')
 
class child(parent1, parent2):
    def __init__(self):
        print("init child")
        # Auto-initialisation des variables de l'ensemble des classes parentes
        for c in __class__.mro()[1:-1]:
            c.__init__(self)
            #exec('self.{} = c.__init__(self)'.format(c.__name__))
            # On initialise dynamiquement les variables avec le nom des parents
            #for c in child.mro()[1:]:
            #    exec('self.{}=c()'.format(c.__name__))
 
    def test(self):
        print('child')
 
        print('\n* parent1.test(self) => appelle parent1.test() sans appeler __init__() car non instanciée')
        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")
        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")
        parent2().test()
 
        print('\n* super().test() => appelle la méthode test() de la classe parent1 sans __init__()')
        super().test()
 
        print('\n* super().__init__() => appelle __init__() de la classe parent1 sans __init__() et initialise la variable var1 à myvar1')
        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')
        parent1.__init__(self)
 
        print('\n* parent2.__init__(self) => appelle parent2.__init__() et initialise la variable var2 à myvar2')
        parent2.__init__(self)
 
        print('\n* super(__class__, self).test() => Appelle la méthode test() de la classe parent1 sans __init__()')
        super(__class__, self).test()
 
        print('\n* super(child, self).test() => appelle la méthode test() de la classe parent1 sans __init__()')
        super(child, self).test()
 
 
if __name__ == '__main__':
    # super() se base sur la première classe rencontrée dans le mro()
    print("\n* child.mro() => affiche l'ordre d'héritage des parents si non spécifié")
    print(child.mro())
 
    print('\n* child().test() => instancie la classe child et appelle la méthode test')
    child().test()
 
    print('\n* a = child() => crée une instance de la classe child dans la variable a')
    a = child()
 
    print('\n* a.defParent1() => appelle la méthode defParent1 seulement présente dans parent1')
    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()
python/programmes/classes_heritage_exemple.txt · Dernière modification : 2017/06/01 11:02 de root