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 :

APSchduler et méthodes de classe


Sujet :

Python

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé Avatar de fma38
    Profil pro
    Inscrit en
    Mai 2013
    Messages
    119
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2013
    Messages : 119
    Par défaut APSchduler et méthodes de classe
    Bonjour,

    Pour mon framework python pKNyX, je voudrais pouvoir faire ceci :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    class Toto(object):
     
        @scheduler.interval_schedule(minutes=5)
        def titi(self):
            pass
    Or, ce décorateur n'est pas à proprement parler un wrapper : il enregistre le 'callable' décoré dans une table de jobs pour l'appeler ultérieurement. Or, ici, ça ne marche pas, puisque titi() est une 'unbound method'.

    L'idée est donc de créer un décorateur spécial qui va enregistrer les méthodes décorées, puis, ultérieurement, pour chaque nouvelle instance de la classe Toto, enregistrer la méthode de cette instance dans APScheduler.

    J'ai la chance que dans mon architecture, c'est le framework qui instancie les objets de la classe Toto, via un appel genre:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    truc.register(Toto, name="mon_toto")
    Je peux donc enregistrer la méthode de l'objet créé à ce moment là. Voici comment je pense procéder :

    - dans mon décorateur spécial (qui ne wrappe pas non plus à proprement parler), je stocke la méthode (unbound) ;
    - lorsque j'instancie un objet, via register(), je parcours mes méthodes stockées pour voir s'il n'y en a pas une de la classe de l'objet instancié (je peux pour ça utiliser stored_method.im_class et comparer à la classe passé à register()) ;
    - j'enregistre la méthode d'objet correspondante dans APScheduler en utilisant stored_method.im_func(my_object).

    Est-ce que ça vous paraît correct ? Y a-t-il plus propre que cette gymnastique ?

  2. #2
    Membre confirmé Avatar de fma38
    Profil pro
    Inscrit en
    Mai 2013
    Messages
    119
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2013
    Messages : 119
    Par défaut
    Bon, en fait, j'ai dit une bétise : le décorateur ne me donne pas une méthode, tout unbound soit-elle, mais une bête fonction !

    Du coup, je perd totalement la connaissance de la classe

    Une idée comment faire autrement ?

  3. #3
    Membre confirmé Avatar de fma38
    Profil pro
    Inscrit en
    Mai 2013
    Messages
    119
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2013
    Messages : 119
    Par défaut
    Bon, j'ai trouvé une façon de faire pour retrouver l'association object/fonction :

    - lors de l'appel du décorateur, je stocke donc les fonctions décorées (dans funcs) ;
    - lorsque j'instancie un objet, je cherche pour voir si l'une des fonctions stockées ne correspond pas à l'une des méthodes de cet object :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    for func in funcs:
        try:
            method = getattr(obj, func.func_name)
            if method.im_func is func:
                apscheduler.add_interval_job(method, ...)
        except AttributeError:
            pass
    (j'ai omis le passage des paramètres donnés au décorateur).

  4. #4
    Membre Expert
    Homme Profil pro
    Inscrit en
    Mars 2007
    Messages
    941
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations forums :
    Inscription : Mars 2007
    Messages : 941
    Par défaut
    Juste une idée comme ça: tu pourrais aussi utiliser une métaclasse. Cela permet de personnaliser la création d'une classe. La création de la classe a lieu après que son corps ait été interprété; cela veut dire que les décorateurs sont exécutés avant.
    • Donc pour les décorateurs, pas grand chose ne change: ils stockent les fonctions décorées dans une liste (funcs).
    • La métaclasse va récupérer les fonctions; comme la classe est maintenant connue (en cours de création, en fait), tu peux les associer à celle-ci (par exemple faire de funcs un attribut de la classe).


    [edit]... ou bien avec un décorateur de classe (Python 2.6+), ça devrait fonctionner aussi

  5. #5
    Membre confirmé Avatar de fma38
    Profil pro
    Inscrit en
    Mai 2013
    Messages
    119
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2013
    Messages : 119
    Par défaut
    Effectivement ; je vais voir si ça permet de mieux structurer le bouzin.

    Merci pour cette piste !

Discussions similaires

  1. méthode et classes
    Par abbd dans le forum Langage
    Réponses: 1
    Dernier message: 14/04/2006, 22h31
  2. Réponses: 1
    Dernier message: 09/03/2006, 18h15
  3. Réponses: 4
    Dernier message: 29/01/2006, 17h54
  4. Forme d'appel de méthode réservé méthodes de classe
    Par Chicobrasil dans le forum Langage
    Réponses: 16
    Dernier message: 03/01/2006, 17h43
  5. [C#] Ajout d'une méthode à la classe DropDownList
    Par Scorff dans le forum ASP.NET
    Réponses: 2
    Dernier message: 30/08/2005, 14h23

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