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 :

Recharger une classe en cours d'exécution


Sujet :

Python

  1. #1
    Nouveau membre du Club
    Inscrit en
    Août 2007
    Messages
    64
    Détails du profil
    Informations forums :
    Inscription : Août 2007
    Messages : 64
    Points : 36
    Points
    36
    Par défaut Recharger une classe en cours d'exécution
    Bonjour,
    Je développe une application Python/Tkinter. Initialement, le code charge une classe avec des Entries avec des variables reliées entre elles par des callbacks:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    self.truc=Classe(divers,arguments)
    Dans mon menu, j'ai une option "Nouveau" qui remet à zéro les variables. Le problème est que les callbacks ne sont pas effectués. Je cherche alors un code pour que la classe soit rechargée lorsque je presse "Nouveau". Une méthode du style:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    def nouveau():
    relance(self.truc)
    Ainsi, les callbacks seront effectués. Quelqu'un connaît-il une telle commande?
    Merci.

  2. #2
    Nouveau membre du Club
    Inscrit en
    Août 2007
    Messages
    64
    Détails du profil
    Informations forums :
    Inscription : Août 2007
    Messages : 64
    Points : 36
    Points
    36
    Par défaut
    J'ai fini par touver le truc: au premier appel de la classe:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    self.args=(plusieurs,arguments)
    self.truc=Classe(*self.args)
    et ensuite dans le code du bouton "Nouveau"
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    def nouveau():
    self.truc.__class__(*self.args)
    Je ne sais pas s'il existe une meilleure programmation, mais ce code marche.

  3. #3
    Rédacteur

    Avatar de Matthieu Brucher
    Profil pro
    Développeur HPC
    Inscrit en
    Juillet 2005
    Messages
    9 810
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations professionnelles :
    Activité : Développeur HPC
    Secteur : Industrie

    Informations forums :
    Inscription : Juillet 2005
    Messages : 9 810
    Points : 20 970
    Points
    20 970
    Par défaut
    Tu dois relancer certaines choses ? Pourquoi ne mets-tu pas ces choses dans une méthode que tu vas rappeler au moment de la réinitialisation ? C'est ce qui est fait généralement. Appeler la méthode __class__ est... peu recommandée, on ne sait pas forcément ce qui se passe réellement.

  4. #4
    Nouveau membre du Club
    Inscrit en
    Août 2007
    Messages
    64
    Détails du profil
    Informations forums :
    Inscription : Août 2007
    Messages : 64
    Points : 36
    Points
    36
    Par défaut
    C'est gentil de te pencher sur ma question. Je crois que j'ai assez bien décrit ce que je veux dans le premier message. Je souhaite vraiment relancer la classe, pas par son nom propre mais par son alias (ici self.truc). La raison est que le nom de la classe peut changer, mais pas l'alias.

    Entretemps j'ai aussi cherché à insérer un __call__ dans les classes ce qui aurait permis de faire (si j'ai bien compris) un self.truc(*args). Je n'ai pas réussi à résoudre tous les bugs, d'où la programmation avec __class__.

    Je suis conscient que je ne maîtrise pas toutes les implications que peut avoir cette programmation et si tu peux me mettre un bout de code mieux que ce que j'ai, je suis preneur.

  5. #5
    Rédacteur

    Avatar de Matthieu Brucher
    Profil pro
    Développeur HPC
    Inscrit en
    Juillet 2005
    Messages
    9 810
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations professionnelles :
    Activité : Développeur HPC
    Secteur : Industrie

    Informations forums :
    Inscription : Juillet 2005
    Messages : 9 810
    Points : 20 970
    Points
    20 970
    Par défaut
    Citation Envoyé par frites.saucisse Voir le message
    C'est gentil de te pencher sur ma question. Je crois que j'ai assez bien décrit ce que je veux dans le premier message. Je souhaite vraiment relancer la classe, pas par son nom propre mais par son alias (ici self.truc). La raison est que le nom de la classe peut changer, mais pas l'alias.
    Pardon, j'édite, je viens de comprendre ce qui se passe réellement... En fait, tu crées une nouvelle instance de type self.truc, mais tu en fais quoi ?

  6. #6
    Nouveau membre du Club
    Inscrit en
    Août 2007
    Messages
    64
    Détails du profil
    Informations forums :
    Inscription : Août 2007
    Messages : 64
    Points : 36
    Points
    36
    Par défaut
    Après avoir détruit l'ancienne instance de self.truc, je la recharge.

    self.truc est une page avec des entries dont les variables sont liées par des callbacks. Lorsque l'utilisateur de l'application demande un nouvel affichage de la page (bouton Nouveau), je recharge self.truc complètement pour que les variables soient initialisées et les callbacks appelés.

  7. #7
    Rédacteur

    Avatar de Matthieu Brucher
    Profil pro
    Développeur HPC
    Inscrit en
    Juillet 2005
    Messages
    9 810
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations professionnelles :
    Activité : Développeur HPC
    Secteur : Industrie

    Informations forums :
    Inscription : Juillet 2005
    Messages : 9 810
    Points : 20 970
    Points
    20 970
    Par défaut
    Citation Envoyé par frites.saucisse Voir le message
    Après avoir détruit l'ancienne instance de self.truc, je la recharge.
    Ce qui m'a induit en erreur, c'est un problème de sémantique. Tu ne recharges pas l'instance, tu détruis l'ancienne et tu en recrées une nouvelle, tu ne la recharges pas
    En tout cas, la manière de faire est, à mon sens, la bonne

  8. #8
    Expert éminent sénior
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 720
    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 720
    Points : 31 037
    Points
    31 037
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par Matthieu Brucher Voir le message
    Ce qui m'a induit en erreur, c'est un problème de sémantique. Tu ne recharges pas l'instance, tu détruis l'ancienne et tu en recrées une nouvelle, tu ne la recharges pas
    En tout cas, la manière de faire est, à mon sens, la bonne
    Euh, suis pas excellent en Python mais on peut pas surcharger la méthode "__new__()" ???
    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]

  9. #9
    Rédacteur

    Avatar de Matthieu Brucher
    Profil pro
    Développeur HPC
    Inscrit en
    Juillet 2005
    Messages
    9 810
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations professionnelles :
    Activité : Développeur HPC
    Secteur : Industrie

    Informations forums :
    Inscription : Juillet 2005
    Messages : 9 810
    Points : 20 970
    Points
    20 970
    Par défaut
    __new__ sert à autre chose, à allouer l'espace mémoire nécessaire, entre autres. Donc c'est une très mauvaise idée.


    Pour bien apprendre Python suis ces tutoriels et cours de formation Python : http://python.developpez.com/cours/
    Le meilleur livre Python : Apprendre à programmer avec Python 3 par Gérard Swinnen http://python.developpez.com/cours/apprendre-python3/

  10. #10
    Expert éminent sénior
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 720
    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 720
    Points : 31 037
    Points
    31 037
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par Matthieu Brucher Voir le message
    __new__ sert à autre chose, à allouer l'espace mémoire nécessaire, entre autres. Donc c'est une très mauvaise idée.
    Ok j'ai dit une grosse c..... - J'aime beaucoup Python mais j'ai encore du mal à tout maitriser...
    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]

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Forcer la JVM à recharger une classe.
    Par Sierra3193 dans le forum Langage
    Réponses: 12
    Dernier message: 17/01/2009, 22h37
  2. Réponses: 9
    Dernier message: 01/04/2008, 13h34
  3. récupérer des infos sur une application en cours d'exécution
    Par r0d dans le forum Administration système
    Réponses: 5
    Dernier message: 31/01/2008, 15h59
  4. Comment masquer une application en cours d'exécution
    Par wajdiisi2007 dans le forum VB 6 et antérieur
    Réponses: 2
    Dernier message: 29/08/2007, 00h45
  5. arrêt d'une requete en cours d'exécution
    Par fradeo dans le forum DB2
    Réponses: 8
    Dernier message: 21/06/2007, 10h44

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