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 :

overrider __getattribute__ on the fly ?


Sujet :

Python

  1. #1
    Membre averti
    Inscrit en
    Juin 2006
    Messages
    570
    Détails du profil
    Informations forums :
    Inscription : Juin 2006
    Messages : 570
    Points : 340
    Points
    340
    Par défaut overrider __getattribute__ on the fly ?
    Bonjour,

    je sais que la fonction __getattribute__ doit être utilisée avec précaution, mais j'aurais besoin de l'écraser dans l'un de mes objets.
    Mais l'écraser que dans certain cas, donc pas à la construction de mon objet car cette decision se se fait par le model.

    Je tente donc de faire

    a = MaClass()
    a.__getattribute__ = lambda name: mafunction(name)

    Mais c'est toujours le __getattribute__ de base qui est utilisé.

    Alors je peux faire ca:

    MaClass.__getattribute__ = lambda self, name: mafunction(self, name)

    Mais j'aimerais éviter si possible.

    Est ce qu'il y a un moyen d'overrider le getattribute on the fly, ou alors une fois l'objet créé cela ne peut plus bouger ?

  2. #2
    Expert confirmé Avatar de PauseKawa
    Homme Profil pro
    Technicien Help Desk, maintenance, réseau, système et +
    Inscrit en
    Juin 2006
    Messages
    2 725
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Technicien Help Desk, maintenance, réseau, système et +
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2006
    Messages : 2 725
    Points : 4 005
    Points
    4 005
    Par défaut
    Bonjour,

    Une solution comme ceci ?
    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
    class Foo(object):
        def __len__(self):
            return 1
        def __getattribute__(*args):
            return object.__getattribute__(*args)
     
    class Bar(Foo):
        def __getattribute__(*args):
            print('bar code')
            return object.__getattribute__(*args)
     
     
    bar = Foo()
    print(bar.__len__())
    old_class = bar.__class__
    bar.__class__ = Bar
    print(bar.__len__())
    bar.__class__ = old_class
    print(bar.__len__())
    @+
    Merci d'utiliser le forum pour les questions techniques.

  3. #3
    Membre averti
    Inscrit en
    Juin 2006
    Messages
    570
    Détails du profil
    Informations forums :
    Inscription : Juin 2006
    Messages : 570
    Points : 340
    Points
    340
    Par défaut
    Ca marcherait aussi mais j'aurais preferé une solution plus dynamique. La nouvelle class ne se fera pas dans le domaine model mais au niveau datamapper.
    Mais tant pi je vais partir la dessus, merci bien !

  4. #4
    Expert confirmé Avatar de PauseKawa
    Homme Profil pro
    Technicien Help Desk, maintenance, réseau, système et +
    Inscrit en
    Juin 2006
    Messages
    2 725
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Technicien Help Desk, maintenance, réseau, système et +
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2006
    Messages : 2 725
    Points : 4 005
    Points
    4 005
    Par défaut
    Bonsoir,

    En fait je n'ai pas dus comprendre la différence entre a.__getattribute__ = lambda name: mafunction(name) et bar.__class__ = Bar : Que cela soit une fonction ou une classe que vous déclariez qu'importe ?
    Ceci dit si vous voulez du 'plus on the fly' vous pouvez utiliser type
    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
    class Foo(object):
        def __len__(self):
            return 1
        def __getattribute__(*args):
            return object.__getattribute__(*args)
     
     
    def newgetattribute(*args):
        print('bar code')
        return object.__getattribute__(*args)
     
     
    bar = Foo()
    print(bar.__len__())
    old_class = bar.__class__
    bar.__class__ = type('derived', (Foo,), {'__getattribute__': newgetattribute})
    print(bar.__class__)
    print(bar.__len__())
    bar.__class__ = old_class
    print(bar.__len__())
    print('derived' in locals())
    mais cela reviens au même si ce n'est que 'derived' ne vas pas polluer l'espace de nom.
    La solution de la classe dérivée me semble le plus propre mais il y a sans doute d'autres réponses.

    Cela correspond à la question ou je fais fausse route ?

    @+
    Merci d'utiliser le forum pour les questions techniques.

  5. #5
    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,
    __getattribute__ a le défaut d'être appelé pour accéder à n'importe quel attribut d'une l'instance (y compris les méthodes).
    Si le but est de faire un "datamapper", il est plus "simple" de passer par des "descriptors": ils sont plus sélectifs.
    - W
    Architectures post-modernes.
    Python sur DVP c'est aussi des FAQs, des cours et tutoriels

Discussions similaires

  1. [GWT] Obtenir un fichier généré "on the fly"?
    Par k o D dans le forum GWT et Vaadin
    Réponses: 5
    Dernier message: 06/05/2009, 08h50
  2. animation on the fly
    Par new_matlab dans le forum MATLAB
    Réponses: 5
    Dernier message: 27/04/2009, 16h13
  3. Réponses: 2
    Dernier message: 20/11/2008, 15h10
  4. [MySQL] thumbnail persistant ou on the fly?
    Par darkbob dans le forum PHP & Base de données
    Réponses: 3
    Dernier message: 14/06/2007, 16h35
  5. Création d'objects "on the fly"
    Par ploxien dans le forum Langage
    Réponses: 6
    Dernier message: 09/05/2007, 09h52

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