Partage
  • Partager sur Facebook
  • Partager sur Twitter

Récupérer les fonctions d'une class sans héritage

Sujet résolu
    4 août 2022 à 14:19:23

    Bonjour à tous

    (Deuxième post de la journée :-°)

    J'ai un problème sur mon script, en gros je dois récupérer toutes les fonctions d'une class

    MAIS!Si la class hérite d'une autre class je ne veux pas récupérer ces fonctions (dont elle hérite). Uniquement les fonctions définie dans la class, donc pas l'héritage.

    Dans mon cas j'aimerai récupérer ça:

    class C1():
       def __init__(self):
          pass
       def fonc_1(self):
          pass
       def fonc_2(self):
           pass
    
    class C2(C1):
        def __init__(self):
           pass
        def fonc_1(self):
           pass
        def fonc_2(self):
           pass
    
    # Résultat:
    ['fonc_1', 'fonc_2'] # Pour la premiere class
    ['fonc_1', 'fonc_2'] # Pour la deuxieme
    # \/ Surtout pas ça \/
    ['fonc_1', 'fonc_2']
    ['fonc_1', 'fonc_2', 'fonc_1', 'fonc_2'] # Pour la deuxieme

    Désolé si il y a des problèmes d'identation.

    Je vous remercie par avance,

    VitriSnake

    @unfred, OpenClassrooms m'empêche de répondre à ton message, je le fais donc ici.

    umfred a écrit:

    tu procèdes de quelle façon actuellement ?

    Sinon, en parcourant les clés de C1.__dict__ et regardant si la valeur est une fonction, on doit pouvoir s'en sortir 

    >>>res=[]
    >>> for key in C1.__dict__:
    ...     if inspect.isfunction(C1.__dict__[key]) and key != '__init__':
    ...             res.append(key)
    ...
    >>> res


    à convertir en fonction par exemple.


    Oui! Mais non... Moi mon problème c'est que je ne veux pas que les fonctions hérités apparaissent dans cette liste. En gros je fais un diagramme de class et je ne veux pas qu'une class apparaisse plusieurs fois. D'où mon problème! J'ai la liste que génère ton code mais elle contient aussi les fonctions hérités! Voici une capture d'écran.

    Typiquement je veux que class_4 ne fasse apparaitre uniquement la 1ere ligne.

     

    -
    Edité par CelticDev 4 août 2022 à 15:18:20

    • Partager sur Facebook
    • Partager sur Twitter
      4 août 2022 à 15:08:30

      tu procèdes de quelle façon actuellement ?

      Sinon, en parcourant les clés de C1.__dict__ et regardant si la valeur est une fonction, on doit pouvoir s'en sortir 

      >>>res=[]
      >>> for key in C1.__dict__:
      ...     if inspect.isfunction(C1.__dict__[key]) and key != '__init__':
      ...             res.append(key)
      ...
      >>> res


      à convertir en fonction par exemple.

      • Partager sur Facebook
      • Partager sur Twitter
        4 août 2022 à 15:13:32

        umfred a écrit:

        tu procèdes de quelle façon actuellement ?

        Sinon, en parcourant les clés de C1.__dict__ et regardant si la valeur est une fonction, on doit pouvoir s'en sortir 

        >>>res=[]
        >>> for key in C1.__dict__:
        ...     if inspect.isfunction(C1.__dict__[key]) and key != '__init__':
        ...             res.append(key)
        ...
        >>> res

        Yes mais là j'ai un autre problème! Si la class hérite d'une autre, on verra apparaitre les fonctions hérités. Moi je veux uniquement les fonctions "natives" sans les fonctions hérités!

        En fait je m'explique, mon projet c'est de créer un diagramme de class, d'où mon problème, je ne veux pas que si on ne défini pas une fonction dans le code, elle apparaisse dans mon diagramme.

        Je vous mets une capture d'écran.





        -
        Edité par CelticDev 4 août 2022 à 15:13:55

        • Partager sur Facebook
        • Partager sur Twitter
          4 août 2022 à 15:45:38

          j'ai fait aussi l'essai sur le C2 de ton exemple, et je n'ai pas ce souci là

          >>> class C3(C1):
          ...     def __init__(self):
          ...             pass
          ...     def fonction_1(self):
          ...             pass
          ...     def fonction_2(self):
          ...             pass
          ...
          >>> res=[]
          >>> for key in C3.__dict__:
          ...     if inspect.isfunction(C3.__dict__[key]) and key !='__init__':
          ...             res.append(key)
          ...
          >>> res
          ['fonction_1', 'fonction_2']
          


          ton problème c'est peut-être que tu ne réinitialises pas ta liste entre les 2.

          Edit pour ton problème de réponse, il a peut-être été vu comme spam, auquel cas il faut le signalé sur le forum https://openclassrooms.com/forum/sujet/si-votre-message-est-considere-comme-spam (je l'ai fait pour toi au cas où c'était le cas)

          -
          Edité par umfred 4 août 2022 à 15:50:30

          • Partager sur Facebook
          • Partager sur Twitter
            4 août 2022 à 15:54:05

            umfred a écrit:

            j'ai fait aussi l'essai sur le C2 de ton exemple, et je n'ai pas ce souci là

            >>> class C3(C1):
            ...     def __init__(self):
            ...             pass
            ...     def fonction_1(self):
            ...             pass
            ...     def fonction_2(self):
            ...             pass
            ...
            >>> res=[]
            >>> for key in C3.__dict__:
            ...     if inspect.isfunction(C3.__dict__[key]) and key !='__init__':
            ...             res.append(key)
            ...
            >>> res
            ['fonction_1', 'fonction_2']
            

            Ok! Merci beaucoup! Mais j'ai une autre question! Est ce qu'il est possible de récupérer toutes les variables d'une class, et, pareille, sans l'héritage?





            • Partager sur Facebook
            • Partager sur Twitter
              4 août 2022 à 16:02:35

              CelticDev a écrit:

              Ok! Merci beaucoup! Mais j'ai une autre question! Est ce qu'il est possible de récupérer toutes les variables d'une class, et, pareille, sans l'héritage?


              bah c'était la question de ton autre sujet, non ? à laquelle j'ai répondu via le __dict__ sur une instance de la classe
              • Partager sur Facebook
              • Partager sur Twitter
                4 août 2022 à 16:35:32

                Oui, en partie! Mais c'est bon, sur ce topic ton code marche donc good :)

                Je mets en résolu

                • Partager sur Facebook
                • Partager sur Twitter

                Récupérer les fonctions d'une class sans héritage

                × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
                × Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
                • Editeur
                • Markdown