IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Python Discussion :

[Article] Héritage simple, héritage multiple et métaclasse


Sujet :

Python

  1. #1
    Expert éminent

    Avatar de deusyss
    Homme Profil pro
    Expert Python
    Inscrit en
    Mars 2010
    Messages
    1 659
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Expert Python
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2010
    Messages : 1 659
    Points : 8 442
    Points
    8 442
    Par défaut [Article] Héritage simple, héritage multiple et métaclasse
    "La connaissance appartient à tout le monde" (Film Antitrust)

    Tout le nécessaire pour Python:
    *News/Accueil *Cours/tutoriels *FAQ
    *Forums *Outils dédiés *Mon espace personnel avec mes Articles, Cours et Tutoriels

  2. #2
    Expert éminent
    Avatar de tyrtamos
    Homme Profil pro
    Retraité
    Inscrit en
    Décembre 2007
    Messages
    4 461
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2007
    Messages : 4 461
    Points : 9 248
    Points
    9 248
    Billets dans le blog
    6
    Par défaut
    Bonjour,

    Très intéressant, merci!
    Un expert est une personne qui a fait toutes les erreurs qui peuvent être faites, dans un domaine étroit... (Niels Bohr)
    Mes recettes python: http://www.jpvweb.com

  3. #3
    Expert éminent

    Avatar de deusyss
    Homme Profil pro
    Expert Python
    Inscrit en
    Mars 2010
    Messages
    1 659
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Expert Python
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2010
    Messages : 1 659
    Points : 8 442
    Points
    8 442
    Par défaut
    De rien, heureux que ça plaise
    "La connaissance appartient à tout le monde" (Film Antitrust)

    Tout le nécessaire pour Python:
    *News/Accueil *Cours/tutoriels *FAQ
    *Forums *Outils dédiés *Mon espace personnel avec mes Articles, Cours et Tutoriels

  4. #4
    Membre averti Avatar de cervo
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Décembre 2012
    Messages
    220
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Côte d'Ivoire

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Décembre 2012
    Messages : 220
    Points : 388
    Points
    388
    Par défaut


    Merci ! super doc
    Toute chose dépend de la valeur qu'on lui attribue !

  5. #5
    Expert éminent

    Avatar de deusyss
    Homme Profil pro
    Expert Python
    Inscrit en
    Mars 2010
    Messages
    1 659
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Expert Python
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2010
    Messages : 1 659
    Points : 8 442
    Points
    8 442
    Par défaut
    Un heureux de plus
    "La connaissance appartient à tout le monde" (Film Antitrust)

    Tout le nécessaire pour Python:
    *News/Accueil *Cours/tutoriels *FAQ
    *Forums *Outils dédiés *Mon espace personnel avec mes Articles, Cours et Tutoriels

  6. #6
    Candidat au Club
    Homme Profil pro
    Pôle Emploi
    Inscrit en
    Janvier 2014
    Messages
    3
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Pôle Emploi
    Secteur : Service public

    Informations forums :
    Inscription : Janvier 2014
    Messages : 3
    Points : 4
    Points
    4
    Par défaut Amélioration du cour sur les héritages et classes Python
    Bonjour :-)

    J'ai un complément à demander pour intégration au cour «Concepts avancés Python» qui me semble important dans la section «Héritage simple, héritage multiple et métaclasses».

    En effet il manque une partie sur les classes proxy Python.
    Genre :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    class A:
    def __init__(self, mon_paramètreA):
        self.ma_propriétéA = mon_paramètreA
     
        def maMéthodeA(self):
            pass
     
     
    class B:
       def __init__(self, mon_paramètreB):
             self.ma_propriétéB = mon_paramètreB
     
            def maMéthodeB(self):
             pass 
     
     
    class Proxy:
         def __new__(cls, mon_paramètre):
             if mon_paramètre == 'valeur1':
                 return A(mon_paramètre)
            if mon_paramètre == 'valeur2':
                 return B(mon_paramètre)

    Et sur l'héritage conditionnel.
    Genre:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    class A:
         def __init__(self, mon_paramètreA):
             self.ma_propriétéA = mon_paramètreA 
     
        def maMéthodeA(self):
             pass 
     
     
    class ProxyHeritage:
         def __new__(cls, mon_paramètre):
             class B(A if mon_paramètre == 'Valeur' else object):
                 def __init__(self, mon_paramètreB):
                     self.ma_propriétéB = mon_paramètreB 
     
                def maMéthodeB(self):
                     pass 
     
            return B(mon_paramètre)
    Je construis moi même un cours open source dédié à la programmation Python pour l'administrateur systèmes.
    voir mon site du cour,
    Avec le site source en cour de rédaction.

  7. #7
    Expert éminent sénior
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 283
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Manche (Basse Normandie)

    Informations professionnelles :
    Activité : Architecte technique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2008
    Messages : 21 283
    Points : 36 770
    Points
    36 770
    Par défaut
    Salut,

    Héritage simple, multiple et metaclass sont mis en œuvre spécifiquement avec Python (on fait un peu autrement avec les autres langage).
    Ce que vous appelez "proxy" ressemble étrangement au pattern factory de la POO. Et les patterns sont indépendant du langage objet utilisé (il n'y a rien de spécifique à Python là dedans).

    - W
    Architectures post-modernes.
    Python sur DVP c'est aussi des FAQs, des cours et tutoriels

  8. #8
    Candidat au Club
    Homme Profil pro
    Pôle Emploi
    Inscrit en
    Janvier 2014
    Messages
    3
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Pôle Emploi
    Secteur : Service public

    Informations forums :
    Inscription : Janvier 2014
    Messages : 3
    Points : 4
    Points
    4
    Par défaut
    Citation Envoyé par wiztricks Voir le message
    Salut,

    Héritage simple, multiple et metaclass sont mis en œuvre spécifiquement avec Python (on fait un peu autrement avec les autres langage).
    Ce que vous appelez "proxy" ressemble étrangement au pattern factory de la POO. Et les patterns sont indépendant du langage objet utilisé (il n'y a rien de spécifique à Python là dedans).

    - W
    Bonjour :-)

    C'est juste une demande pour aider les programmeurs.
    Parce que personnellement j'ai été confronté à ces difficultés il y a quelques années après avoir suivi ce cour sur Python, et je pense que ces deux concept sont important pour le développement objets avec Python :-)

    Ils ne sont que trop rarement dans les cours objets sur Python…

  9. #9
    Expert éminent sénior
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 283
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Manche (Basse Normandie)

    Informations professionnelles :
    Activité : Architecte technique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2008
    Messages : 21 283
    Points : 36 770
    Points
    36 770
    Par défaut
    Citation Envoyé par sefran007 Voir le message
    Ils ne sont que trop rarement dans les cours objets sur Python…
    Je ne vois pas l'intérêt de faire un cours sur les patterns de la POO avec Python.
    Il est préférable de comprendre les "patterns" et voir combien nombre d'entre eux sont inutiles avec Python (et il y a déjà des tutos. à ce sujet mais il faut avoir fait l'étape POO/Patterns avant).

    - W
    Architectures post-modernes.
    Python sur DVP c'est aussi des FAQs, des cours et tutoriels

  10. #10
    Candidat au Club
    Homme Profil pro
    Pôle Emploi
    Inscrit en
    Janvier 2014
    Messages
    3
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Pôle Emploi
    Secteur : Service public

    Informations forums :
    Inscription : Janvier 2014
    Messages : 3
    Points : 4
    Points
    4
    Par défaut
    Bon j'ai trouvé une solution encore plus élégante pour faire des héritages conditionnels, avec en plus la possibilité de filtrer les méthodes de classe à l'héritage (la méthode super() permettant de filtrer les propriétés de classes).

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    class Base(object):
        def bad_function(self):
            print("OK pour la fonction bad_function dans la classe %s" % self.__class__)
        def good_function(self):
            print("OK pour la fonction good_fonction dans la classe %s" % self.__class__)
     
    class Child(Base):
        def __init__(self, paramètreChild=False, banieméthodes=[]):
            parent = Base
            class new_parent(parent.__base__):
                pass
            parent_list = dir(parent)
            new_parent_list = dir(new_parent)
            candidates = set(parent_list) - set(new_parent_list)
            if paramètreChild:
                for candidate in candidates:
                    if candidate not in banieméthodes:
                        setattr(new_parent, candidate, parent.__getattribute__(parent, candidate))
            Child.__bases__ = (new_parent, )
     
     
    class Finale(Child):
        def __init__(self, paramètreFinal=False, options=[]):
            if paramètreFinal:
                if options == []:
                    super().__init__(paramètreFinal)
                else:
                    super().__init__(paramètreFinal, options)
            elif options != []:
                super().__init__(True, banieméthodes=options)
            else:
                super().__init__()
     
     
    print('Finale()')
    c = Finale()
    try:
        c.bad_function()
    except AttributeError:
        print("fonction bad_function supprimée!")
    try:
        c.good_function()
    except AttributeError:
        print("fonction good_function supprimée!")
    print('Finale(True)')
    c = Finale(True)
    try:
        c.bad_function()
    except AttributeError:
        print("fonction bad_function supprimée!")
    try:
        c.good_function()
    except AttributeError:
        print("fonction good_function supprimée!")
    print('Finale(options=[\'bad_function\'])')
    c = Finale(options=['bad_function'])
    try:
        c.bad_function()
    except AttributeError:
        print("fonction bad_function supprimée!")
    try:
        c.good_function()
    except AttributeError:
        print("fonction good_function supprimée!")
    b = Base()
    b.bad_function()
    Voilà un code plus propre pour l'héritage conditionnel de classes, qui ne perturbe plus les héritages en cascade conditionnels et la syntaxe normale des classes Python.

    J'espère que ces commentaires pourront aider un développeur débutant, ou plus ingénieur systèmes comme moi

  11. #11
    Expert éminent sénior
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 283
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Manche (Basse Normandie)

    Informations professionnelles :
    Activité : Architecte technique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2008
    Messages : 21 283
    Points : 36 770
    Points
    36 770
    Par défaut
    Citation Envoyé par sefran007 Voir le message
    J'espère que ces commentaires pourront aider un développeur débutant, ou plus ingénieur systèmes comme moi
    A priori, une classe sert à fabriquer des objets semblables (qui ont les mêmes attributs).
    Ce que vous faites est juste un bricolage infâme: vous feriez mieux d'ouvrir une discussion pour décrire le problème que vous cherchez à résoudre.

    - W
    Architectures post-modernes.
    Python sur DVP c'est aussi des FAQs, des cours et tutoriels

  12. #12
    Expert confirmé
    Avatar de popo
    Homme Profil pro
    Analyste programmeur Delphi / C#
    Inscrit en
    Mars 2005
    Messages
    2 672
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Analyste programmeur Delphi / C#
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2005
    Messages : 2 672
    Points : 5 253
    Points
    5 253
    Par défaut
    Citation Envoyé par wiztricks Voir le message
    A priori, une classe sert à fabriquer des objets semblables (qui ont les mêmes attributs).
    Ce que vous faites est juste un bricolage infâme: vous feriez mieux d'ouvrir une discussion pour décrire le problème que vous cherchez à résoudre.

    - W
    Bonjour,

    Etant novice en Python, et plutôt habitué à des langages comme .Net, c'est la première fois je je croise la notion d'héritage conditionnel.

    J'ai vu que le dernier code posté sefran007 ne vous plait pas du tout.
    De ce que j'en comprends, je suis plutôt d'accord

    Mais quid de la forme suivante que j'ai également pu voir ailleurs ?
    class B(A if mon_paramètre == 'Valeur' else object)

    Comme je l'ai dit cette notion est totalement nouvelle pour moi et j'ai énormément de mal à comprendre en quelle occasion il faudrait l'utiliser.
    Est-ce que c'est une pratique courante ?
    Dans quel cas de figure doit-on l'utiliser ?

  13. #13
    Expert éminent sénior
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 283
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Manche (Basse Normandie)

    Informations professionnelles :
    Activité : Architecte technique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2008
    Messages : 21 283
    Points : 36 770
    Points
    36 770
    Par défaut
    Salut,

    Citation Envoyé par popo Voir le message
    Mais quid de la forme suivante que j'ai également pu voir ailleurs ?
    class B(A if mon_paramètre == 'Valeur' else object)
    Ici, la classe B hérite conditionnellement de A ou d'object.

    Reste à voir la motivation qu'il y a derrière... et en quoi çà va être utile d'avoir un b (= B()) qui soit ou pas instance de A. C'est pas parce qu'on peut que ça à plus de sens que de le faire autrement de façon "plus orthodoxe".

    Mais ça demande de connaître le problème qu'on cherche à résoudre et faire un arbitrage des avantages/inconvénients entre différentes solutions... en allant un peu plus loin que l'aspect fonctionnel (çà marche) pour intégrer des critères non-techniques.

    Normalement, un code devrait être revu par un pair qui va poser des questions, maintenu par d'autres personnes que le développeur qui auront de la peine à toucher un code qu'ils ne comprennent pas, sans parler de documenter, tester...

    C'est vrai que dans la vraie vie, le programmeur Python est plutôt solitaire et peut programmer correctement ou fabriquer un code qui ne sera pas maintenable lorsqu'il changera de boulot. C'est dommage pour la boîte qui l'emploie mais "logique" dans une société où on veut aller vite au résultat en minimisant l'effort à faire pour l'obtenir.

    - W
    Architectures post-modernes.
    Python sur DVP c'est aussi des FAQs, des cours et tutoriels

Discussions similaires

  1. Héritage d'héritage, d'héritage etc
    Par darkman19320 dans le forum C++
    Réponses: 3
    Dernier message: 05/12/2011, 13h12
  2. Héritage : simple appel à une methode
    Par seb-oulba dans le forum Général JavaScript
    Réponses: 4
    Dernier message: 05/09/2006, 12h43
  3. probléme : template multiple et héritage simple.
    Par laetmo dans le forum Langage
    Réponses: 1
    Dernier message: 03/08/2006, 02h44

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo