• # Bin comme d'autres caractères

    Posté par  . Évalué à 4. Dernière modification le 13/06/20 à 17:32.

    Salut,

    Vu le peu d'info, je suppose que tu dois chercher \\ pour détecter \.

    En général, pour avoir de l'aide, c'est mieux de préciser ce qu'on fait (ou cherche à faire).

    Matricule 23415

  • # ok

    Posté par  . Évalué à 1.

    ok, effectivement, j'ai trouvé tout seul.
    je cherche juste à apprendre, en l'occurence écrire un dictionnaire vers un fichier puis recréer le dictionnaire à partir du fichier.
    j'ai une autre question tant que j'y suis:
    dans un objet
    Class(object):
    si je fais une methode/fonction
    def fonction(argument):
    sans mettre self dans les arguments, qu'est ce que ca change? est ce que je peux invoquer la fonction plus loin dans d'autres méthodes en l'appliquant à self ou est ce que python va bugguer et ne pas comprendre à quoi est rattachée cette fonction à l'interieur des methodes de l'objet?

    • [^] # Re: ok

      Posté par  . Évalué à 3. Dernière modification le 13/06/20 à 22:26.

      Salut,

      self est la référence à l'instance de l'objet courant.

      Voilà :)

      Comme pour la question précédente, je sais pas en dire plus (ou plutôt, comme c'est trop vague, bah je ne peux m'avancer).

      Matricule 23415

    • [^] # Re: ok

      Posté par  . Évalué à 3. Dernière modification le 14/06/20 à 11:28.

      Pour info: le mot self n'est ni un mot-clé ni un mot réservé, c'est une convention d'écriture servant à discerner les méthodes (fonctions membres d'une classe) des fonctions non membres. Donc si tu vois le mot self apparaître dans la liste des arguments à l'appel d'un objet, ce dernier est une fonction membre d'une classe. De plus, il n'apparaît (en premier) dans les arguments d'un appel que lors des appels à l'intérieur des fonctions membres d'une même classe — d'où… self .

      Si tu définis une fonction à l'intérieur de la définition d'une classe, comme ceci:

          class Foo(object):
              def foo():
                  # foo() est un objet de type 'fonction' de la classe Foo
                  print('In Foo.foo!')

      L'objet foo() est une fonction de la classe Test (attention, ce n'est ni une méthode ni une méthode de classe, cette dernière étant un autre concept):

          Foo.foo()

      Sachant cela, on définit donc une méthode à l'aide de l'indice 'self':

          class Bar(Foo):
              def bar(self):
                  # bar() est une méthode de la classe Bar
                  print('In Bar.bar...')
              def baz(self):
                  # Appeler la méthode bar:
                  bar(self)
                  # Appeler l'objet fonction de Foo:
                  Foo.foo()
                  # On peut aussi appeler foo() de cette manière, grâce à l'héritage:
                  __class__.foo()
      
          obj = Bar()
          # Appeler une méthode de Bar via une de ses instances
          obj.bar()
          obj.baz()
      • [^] # Re: ok

        Posté par  . Évalué à 3.

        Salut,

        Tout à fait d'accord pour dire que self n'est pas mot-clef.

        Cependant, ta fonction va rester membre de la classe. Elle peut être juste statique, parce qu'elle n'a pas besoin de savoir à quelle instance, s'il y en a une, elle se réfère.

        Matricule 23415

        • [^] # Re: ok

          Posté par  . Évalué à 2.

          Bien sûr, tu as tout à fait raison. J'ai gardé l'exemple relativement simple volontairement. Comme la question portait sur l'utilisation de 'self' et la confrontation fonction/méthode, il ne m'apparaissait pas nécessaire de développer plus que ça.

          • [^] # Re: ok

            Posté par  . Évalué à 3. Dernière modification le 14/06/20 à 12:48.

            Salut,

            Oui, pas de problème, c'est pour ça que je n'ai pas voulu rentrer dans le détail non plus dans la réponse plus haut :)

            Je crois qu'on a compris que j'ai comris que t'as compris ;) C'était pas à charge contre ton exemple (qui plus est détaillé).

            C'était plus pour donner des indices à l'OP pour qu'il continue de chercher ;)

            Matricule 23415

  • # ok

    Posté par  . Évalué à 1.

    ok merci
    d'apres ce que j'ai compris les methodes de classe servent notamment à ce que les instanciations puissent "communiquer" entre elles, ou à manipuler une instanciation, elles servent d'interfaces

    Mais dans le cas de la fonction foo() de la classe test Foo,quel est l'intérêt pour un programme python de définir cette fonction à l'intérieur de Foo? on ne pourra l'utiliser que si un objet de classe Foo est instancié, cest bien ca?

    je ne comprend pas bien ce que ca changerait en termes de programmation exactement la meme fonction foo(): mais en la définissant par foo(self):

    Enfin,si on ajoute des argument sans self à la fonction foo(arg1,arg2), et qu'on l'utilise dans une methode (constructeur ou d'autres methodes) en l'appliquant à des paramètre d'une instance Foo par exemple foo(self.age, self.taille), est ce que ca fonctionne? est ce que c'est une "mauvaise" pratique de programmation?

    • [^] # Re: ok

      Posté par  . Évalué à 5. Dernière modification le 14/06/20 à 13:04.

      Salut,

      Avis perso, je pense que tu devrais faire un autre sujet puisque le problème est différent. Et utiliser le lien "répondre" :)

      Je vais essayer de te faire un autre exemple basique.

      Matricule 23415

      • [^] # Re: ok

        Posté par  . Évalué à 2. Dernière modification le 14/06/20 à 13:15.

        Donc.

        Problème : je veux trier un tableau d'objets dont je ne connais pas la nature (classe).

        Résolution :
        En soi, la fonction de tri n'a besoin de rien. Elle peut même ne pas être rattachée à une instance. Puisque tout ce dont elle a besoin, c'est les objets à comparer.

        Par contre, en pratique (enfin, comme je le vois toujours fait), chaque objet doit pouvoir se comparer à un autre. Et là, il y a besoin de connaître son identité (self), pour la comparer à l'autre et savoir si on est plus grand ou plus petit, et retourner ça à la fonction de tri, pour qu'elle fasse de l'ordre.

        Matricule 23415

    • [^] # Re: ok

      Posté par  . Évalué à 2. Dernière modification le 14/06/20 à 14:38.

      les méthodes de classe servent notamment à ce que les instanciations puissent "communiquer" entre elles […]

      Pas exactement et pas que. La différence entre une méthode de classe et une méthode tout court est ce que j'entendrais par "rangement" fonctionnel: tu définis une méthode lorsque le traitement s'applique à un objet d'une classe et tu définis une méthode de classe lorsque ce traitement est "porté" par la classe voire commun à toutes les instances.

      En clair, une instance possède par définition un état, réparti sur une ou plusieurs variables internes. Chaque instance d'une classe se trouve dans un état indépendant des autres. Les méthodes gèrent l'état de l'instance à laquelle elles sont rattachées.

      Une classe peut aussi très bien avoir un état. Cet état est indépendant des instances de la classe et se gère à travers des méthodes de classe. Cette situation est toutefois moins fréquente et doit être réfléchie. Je n'ai pas d'exemple suffisamment parlant à donner pour le moment mais en somme quand définir une méthode de classe ou une méthode dépend de ce que tu veux faire — il est très difficile d'être plus précis sans exemple.

      Quant à choisir une fonction définie dans la portée d'une classe (exemple de foo()) plutôt qu'une méthode de classe, je dirais que la seconde est plus propre et prépare mieux le terrain à la manipulation des membres de la classe que la première.

      … quel est l'intérêt pour un programme python de définir [la fonction foo()] à l'intérieur de Foo? on ne pourra l'utiliser que si un objet de classe Foo est instancié, c'est bien ca?

      Non. Elle peut être appelée, comme tu l'as vu, via le nom de la classe, que des instances existent ou non. De plus, comme je l'ai insinué, foo() est plus proche d'une méthode de classe que d'une méthode.

      Cependant il est plus compliqué de gérer l'état d'une classe et de sa descendance avec une fonction comme foo() car elle n'a accès aux membres d'une classe qu'à travers le nom, explicite, de cette classe (la sienne, par exemple). Si la classe Foo est dérivée, foo() ne pourra pas en manipuler l'état.

  • # thx

    Posté par  . Évalué à 1.

    merci, je pense que ma compréhension s'affinera au fur et à mesure que je coderai et que j'expérimenterai de toute façon

Suivre le flux des commentaires

Note : les commentaires appartiennent à celles et ceux qui les ont postés. Nous n’en sommes pas responsables.