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 :

Emulation du getattribute de object


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 Emulation du getattribute de object
    Bonjour,
    je suis en train de lire un livre sur la POO. Dans l'émulation de la méthode __getattribute__ de object, on réserve un sort particulier aux attributs possédant une méthode __get__. Jusque là je comprends. En revanche, dans l'émulation d'un getsetdescriptor, on fait justement appel à la méthode getattribute de object. Ce n'est du coup pas très clair pour moi...

  2. #2
    Membre prolifique
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 830
    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 830
    Billets dans le blog
    1
    Par défaut
    Bonjour
    Citation Envoyé par Rasko Voir le message
    je suis en train de lire un livre sur la POO. Dans l'émulation de la méthode __getattribute__ de object, on réserve un sort particulier aux attributs possédant une méthode __get__. Jusque là je comprends.
    En revanche moi je ne comprends rien. Déjà je n'ai jamais vu de méthode __get__() nulle part (en Python s'entend). Si j'écris par exemple hasattr(str, "split") j'obtiens "True" parce qu'un objet "str" a bien un attribut (en réalité c'est une méthode mais ça reste assimilé à un attribut) nommé "split".
    Si maintenant j'écris hasattr(str, "__get__") j'obtiens "False".
    Il s'ensuit que si un attribut de mon objet est de type "str", cet attribut n'aura pas de méthode __get__(). Ce qui n'empêche pas __getattribute__ de fonctionner sur cet attribut.
    Code python : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    class xxx:
    	def __init__(self):
    		self.s="Hello"
    		self.i=123
    	def __getattribute__(self, attr):
    		print("getting [%s]" % attr)
    		return super().__getattribute__(attr)
     
    >>> x=xxx()
    >>> print(x.s)
    getting [s]
    Hello

    Citation Envoyé par Rasko Voir le message
    En revanche, dans l'émulation d'un getsetdescriptor, on fait justement appel à la méthode getattribute de object. Ce n'est du coup pas très clair pour moi...
    Ni pour moi. Tu as des exemples Python qui parlent de ce getset_descriptor ??? On le trouve dans le code source de Python oui, mais en Python là...
    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]

  3. #3
    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
    Désolé pour mon manque de clarté. Les fonctions par exemple ont une méthode __get__.
    Voici l'émulation proposée dans le livre pour le getattribute de object :
    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
     
      def __getattribute__(self,x):
            classe = type(self)
            x_dans_classe = classe.__dict__.get(x,null)
            if x == "__dict__" and x_dans_classe is null:
                raise AttributeError
            desc = type(x_dans_classe)
            desc_get = getattr(desc,"__get__",null)
            if desc_get is not null and (hasattr(desc,"__set__") or hasattr(desc,"__delete__")):
                return desc_get(x_dans_classe,self,classe)
            dico = getattr(self,"__dict__",{})
            if x in dico:
                return dico[x]
            if desc_get is not null:
                return desc_get(x_dans_classe,self,classe)
            if x_dans_classe is not null:
                return x_dans_classe
            raise AttributeError
    Les getset descriptor sont les objets qui possèdent les méthodes __get__, __set__ et __delete__.
    Et voici le début du code émulant un getset descriptor donné dans le livre :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    class Getset_Descriptor:
        def __init__(self,datatype):
            self.datatype = datatype
        def __set_name__(self,classe,nom):
            self.__objclass__ = classe
            self.__name__ = nom
            self.__qualname__ = classe.__name__ + "." + nom
            self.stock = nom[1:]
        def __get__(self,obj,classe):
            stock = self.stock
            return object.__getattribute__(obj,stock)

  4. #4
    Membre prolifique
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 830
    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 830
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par Rasko Voir le message
    Désolé pour mon manque de clarté. Les fonctions par exemple ont une méthode __get__. Les dictionnaires aussi.
    Voici l'émulation proposée dans le livre pour le getattribute de object
    ...
    Et voici le début du code émulant un getset descriptor donné dans le livre
    Ok, je vois un peu mieux.
    Donc déjà ce ne sont pas des méthodes et classes officielles de Python, ce sont des trucs créés par le tuto pour t'expliquer certaines notions. On peut remarquer par exemple que la classe Getset_Descriptor reprend à peu près la même idée que mon exemple, à savoir montrer le fonctionnement de __getattribute__() qui sera appelé lors de l'appel à __get__(), lequel servira à positionner un attribut et à retourner sa valeur.

    Donc à partir de là, que cherches-tu à comprendre?
    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]

  5. #5
    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
    Non ils existent réellement. Dans l'exemple qui suit, d est un getset_descriptor (chargé de construire le dictionnaire d'une instance) :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    class A:
        pass
    d = A.__dict__["__dict__"]
    Ce que je ne comprends pas, c'est qu'on a besoin du getattribute de object pour définir la méthode __get__. Or, dans le code de __getattribute__, on utilise des objets qui possèdent la méthode __get__. Il faut bien que l'un des deux soient définis avant l'autre, non ? Bref, je m'embrouille...

  6. #6
    Membre prolifique
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 830
    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 830
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par Rasko Voir le message
    Bref, je m'embrouille...
    Ne serait-ce pas ce return object.__getattribute__(obj, stock) qui t'embrouille ??? Parce que "object" ne représente pas l'objet en cours mais l'objet de base Python, dont tous les autres objets héritent de façon implicite. Et cet objet se nomme littéralement "object".
    Donc en appelant le __get__ de ton objet, cela appelle le __getattribute__ de l'objet ancètre qui appellera le __get__ de ce même ancètre. Donc pas de "ping-pong" d'appels.
    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. Notion de boucles dans Business Object
    Par lionelEIGIP dans le forum Deski
    Réponses: 1
    Dernier message: 08/04/2004, 11h26
  2. Réponses: 2
    Dernier message: 30/01/2004, 14h07
  3. [DDL] "object <table> is in use"
    Par TMuet dans le forum SQL
    Réponses: 4
    Dernier message: 26/01/2004, 10h18
  4. Réponses: 8
    Dernier message: 21/11/2003, 18h38
  5. Comment inserer des donnee de type Large Object !!
    Par josoft dans le forum Requêtes
    Réponses: 4
    Dernier message: 20/07/2003, 11h21

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