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 :

Incompréhension méthode __get__


Sujet :

Python

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Homme Profil pro
    Étudiant
    Inscrit en
    Août 2022
    Messages
    19
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Août 2022
    Messages : 19
    Par défaut Incompréhension méthode __get__
    Bonjour,

    lorsqu'on écrit une fonction f dans une classe A, l'appel a.f où a est une instance de A revient à écrire :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    d = A.__dict__["f"]
    d.__get__(a,A)
    Jusque là je comprends. Si je poursuis, comme type(d) possède le descripteur "__get__", lorsqu'on écrit d.__get__, cela revient à écrire :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    e = type(d).__dict__["__get__"]
    e.__get__(d,type(d))
    Maintenant, lorsqu'on écrit e.__get__, cela revient à écrire :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    f = type(e).__dict__["__get__"]
    f.__get__(e,type(e))
    En poursuivant de la même manière pour f.__get__, etc. je constate que le processus finit par s'arrêter et qu'on obtient toujours le même type d'objet (method-wrapper '__get__' of wrapper_descriptor object). Je ne sais pas ce qu'est un wrapper_descriptor, mais tout cela est bien obscur pour moi. Par avance merci pour votre aide.

  2. #2
    Expert éminent
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 741
    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 741
    Par défaut
    Salut,

    Jouer avec les noms systèmes comme __get__ (que vous confondez avec __getitem__) est de la programmation avancée...Enfin pas trop mais assez pour être capable d'aller lire la documentation du langage pour voir ce que les développeurs racontent et les tutos sur ces méthodes disponibles sur Internet.

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

  3. #3
    Membre Expert
    Profil pro
    Inscrit en
    Septembre 2010
    Messages
    1 545
    Détails du profil
    Informations personnelles :
    Âge : 46
    Localisation : France

    Informations forums :
    Inscription : Septembre 2010
    Messages : 1 545

  4. #4
    Membre averti
    Homme Profil pro
    Étudiant
    Inscrit en
    Août 2022
    Messages
    19
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Août 2022
    Messages : 19
    Par défaut
    Je ne pense pas confondre les méthodes __getitem__ et __get__, mais passons. Merci pour votre réponse constructive et éclairante.
    Lorsqu'on écrit a.__get__, Python regarde dans le dictionnaire de type(a) = A si un attribut portant ce nom existe. Cet attribut possédant lui-même une méthode __get__, il renvoie donc A.__dict__["__get__"].__get__(a,A) (j'ai bien compris que c'était plus compliqué que ça et qu'il cherche d'abord s'il existe un attribut __get__ dans le dictionnaire de l'instance). Du coup, si je pose d = A.__dict__["__get__"], on est encore dans la situation précédente, à savoir déterminer d.__get__ . À première vue on pourrait penser que le processus se répète indéfiniment. D'où mon interrogation et mes essais.

  5. #5
    Expert éminent
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 741
    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 741
    Par défaut
    Citation Envoyé par Rasko Voir le message
    Je ne pense pas confondre les méthodes __getitem__ et __get__, mais passons. Merci pour votre réponse constructive et éclairante.
    Lorsqu'on écrit a.__get__, Python regarde dans le dictionnaire de type(a) = A si un attribut portant ce nom existe. Cet attribut possédant lui-même une méthode __get__, il renvoie donc A.__dict__["__get__"].__get__(a,A) (j'ai bien compris que c'était plus compliqué que ça et qu'il cherche d'abord s'il existe un attribut __get__ dans le dictionnaire de l'instance). Du coup, si je pose d = A.__dict__["__get__"], on est encore dans la situation précédente, à savoir déterminer d.__get__ . À première vue on pourrait penser que le processus se répète indéfiniment. D'où mon interrogation et mes essais.
    Vous partez dans des théories inventées pour essayer de comprendre par analogies sur des ça fait comme si...
    __get__ est spécial. __getitem__ fonctionne un peu comme vous le racontez, __get__ pas du tout.
    Et ce qu'on peut faire avec les descripteurs (les objets associés à __get__) est très avancé: si vous ne prenez pas le temps de lire avant d'essayer quoi que ce soit, vous n'y arriverez pas. (et c'est trop compliqué pour pouvoir vous expliquer quoi que ce soit sur ces sujets en quelques lignes).

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

  6. #6
    Expert confirmé Avatar de papajoker
    Homme Profil pro
    Développeur Web
    Inscrit en
    Septembre 2013
    Messages
    2 323
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Nièvre (Bourgogne)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Septembre 2013
    Messages : 2 323
    Par défaut
    bonjour
    Citation Envoyé par Rasko Voir le message
    Je ne sais pas ce qu'est un wrapper_descriptor, mais tout cela est bien obscur pour moi
    Si tu utilises __get__ c'est justement pour les descripteurs…
    Bien sûr , tu as lu la doc

    Citation Envoyé par Rasko;
    lorsqu'on écrit une fonction f dans une classe A
    pas compris où tu vois un rapport avec un descripteur ?

  7. #7
    Membre averti
    Homme Profil pro
    Étudiant
    Inscrit en
    Août 2022
    Messages
    19
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Août 2022
    Messages : 19
    Par défaut
    Une fonction possède une méthode get donc c'est un descripteur non ?

  8. #8
    Expert confirmé Avatar de papajoker
    Homme Profil pro
    Développeur Web
    Inscrit en
    Septembre 2013
    Messages
    2 323
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Nièvre (Bourgogne)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Septembre 2013
    Messages : 2 323
    Par défaut
    Mais, il faut lire la doc (que j'ai mise en lien) ! Tu as la flemme de la lire ? j'ai donc moi aussi la flemme de te répondre

    Citation Envoyé par doc python
    Pour prendre en charge la création automatique des méthodes, les fonctions incluent la méthode __get__() pour lier les méthodes pendant l'accès aux attributs.

    Cela signifie que toutes les fonctions sont des descripteurs hors-données qui renvoient des méthodes liées au cours d'une recherche d'attribut d'une instance. Cela fonctionne ainsi :

  9. #9
    Membre averti
    Homme Profil pro
    Étudiant
    Inscrit en
    Août 2022
    Messages
    19
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Août 2022
    Messages : 19
    Par défaut
    Je n'ai pas la flemme comme tu dis, je sais que les fonctions sont des descripteurs, donc inutile d'aller vérifier. Si j'étais feignant je ne passerais pas autant de temps à lire un bouquin de 900 pages sur la programmation orientée objet en plus de mon travail. Je ne suis pas dans l'informatique. Je cherche régulièrement des explications supplémentaires ailleurs que sur ce forum, et heureusement j'ai envie de dire. Simplement, avant de lire des centaines de lignes en anglais, je pensais que solliciter des experts pour avoir une réponse en français serait préférable. Si à chaque débutant qui pose une question que vous jugez au-delà de son niveau les réponses sont "va regarder la doc", je ne vais pas vous déranger plus longtemps.

  10. #10
    Expert confirmé Avatar de papajoker
    Homme Profil pro
    Développeur Web
    Inscrit en
    Septembre 2013
    Messages
    2 323
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Nièvre (Bourgogne)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Septembre 2013
    Messages : 2 323
    Par défaut
    Citation Envoyé par Rasko Voir le message
    avant de lire des centaines de lignes en anglais, j
    ...
    les réponses sont "va regarder la doc", je ne vais pas vous déranger plus longtemps.
    Citation Envoyé par Rasko Voir le message
    donc inutile d'aller vérifier.
    heureusement que je t'ai donné un lien vers la doc en FR (et même recopier la partie qui t'intéresse ici)... mais puisque tu n'as même pas vérifié mon lien, c'est que tu n'es en fait pas trop intéressé par le sujet


    ---------
    Il faut surtout que tu comprennes que ta question n'a pas de véritable sens : on utilise jamais cette méthode directement, le seul cas d'utilisation est de réécrire cette méthode __get__() , ce que tu ne sembles même pas faire.

  11. #11
    Membre prolifique
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 835
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Février 2006
    Messages : 12 835
    Billets dans le blog
    1
    Par défaut
    Bonjour
    Citation Envoyé par Rasko Voir le message
    Si à chaque débutant qui pose une question que vous jugez au-delà de son niveau les réponses sont "va regarder la doc"
    La réponse c'est plutôt "commence par apprendre les bases de l'objet dans Python avant de vouloir faire de l'objet avancé". Surtout pour un truc qui, si ce n'est pas ton métier, tu n'utiliseras probablement jamais et que tu auras oublié dans 15 jours.
    Mon Tutoriel sur la programmation «Python»
    Mon Tutoriel sur la programmation «Shell»
    Sinon il y en a pleins d'autres. N'oubliez pas non plus les différentes faq disponibles sur ce site
    Et on poste ses codes entre balises [code] et [/code]

Discussions similaires

  1. [Python 3.X] Incompréhension méthode append
    Par Niko21 dans le forum Général Python
    Réponses: 3
    Dernier message: 10/01/2020, 23h03
  2. Réponses: 6
    Dernier message: 21/04/2014, 15h14
  3. Réponses: 9
    Dernier message: 19/05/2009, 22h42
  4. argument de méthode incompréhensible.
    Par Nayila dans le forum AWT/Swing
    Réponses: 10
    Dernier message: 24/03/2008, 22h56
  5. méthode getDocument() incompréhensible
    Par Nayila dans le forum AWT/Swing
    Réponses: 1
    Dernier message: 03/03/2008, 23h02

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