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 :

créer une instance de sous-classe à partir d'une instance de la classe parent


Sujet :

Python

  1. #1
    Membre à l'essai
    Profil pro
    Inscrit en
    Septembre 2003
    Messages
    10
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations forums :
    Inscription : Septembre 2003
    Messages : 10
    Points : 11
    Points
    11
    Par défaut créer une instance de sous-classe à partir d'une instance de la classe parent
    Bonjour,

    Je veux étendre une classe existante (Geometry, créée et maintenue par quelqu'un d'autre) pour y ajouter une fonction. J'ai donc créé ma classe myGeom(Geometry).
    Si mon code contient une instance de Geometry, comment la transformer en instance de myGeom pour utiliser ma fonction ? Je dois partir de cette instance de Geometry car elle est le résultat d'un autre processus.

    Merci
    Christian

  2. #2
    Membre expérimenté
    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
    Points : 1 384
    Points
    1 384
    Par défaut
    Si tu n'as fait qu'ajouter une méthode:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    instance.__class__ = myGeom
    Mais il faut savoir ce qu'on fait: le constructeur de myGeom n'aura pas été appelé... Pourquoi ne pas faire une simple fonction qui opère sur une instance de Geometry (ou une methode d'une autre classe) ?

  3. #3
    Membre à l'essai
    Profil pro
    Inscrit en
    Septembre 2003
    Messages
    10
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations forums :
    Inscription : Septembre 2003
    Messages : 10
    Points : 11
    Points
    11
    Par défaut
    Merci.
    J'avais déjà une fonction qui marchait bien mais je cherchais à étendre la classe pour rendre mon code plus propre et, je dois l'avouer, c'était aussi un exercice de style.
    Malheureusement, le simple fait de changer la classe de l'instance et d'appeler la nouvelle méthode a dégradé énormément les performances. L'exécution passe de 30 secondes à 4 minutes ! (l'opération est exécutée plus de 3000 fois). Je vais donc rester avec ma fonction qui prend Geometry en intrant.
    À propos, comment connaître toute la liste des attributs cachés comme __class__ ?

    Merci

  4. #4
    Membre expérimenté Avatar de pacificator
    Profil pro
    Inscrit en
    Août 2006
    Messages
    1 074
    Détails du profil
    Informations personnelles :
    Âge : 44
    Localisation : France

    Informations forums :
    Inscription : Août 2006
    Messages : 1 074
    Points : 1 728
    Points
    1 728

  5. #5
    Membre expérimenté
    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
    Points : 1 384
    Points
    1 384
    Par défaut
    Une autre technique serait de rajouter dynamiquement une methode à la classe.
    Définir la methode comme une fonction:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    def mymethod(self,...):
        ...
    Si tu peux modifier la classe avant que les instances soient créées, tu peux ajouter la méthode à la classe:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    from new import instancemethod
    myGeom.mymethod = instancemethod(mymethod, None, myGeom)
    Si ce n'est pas possible, tu peux toujours ajouter la méthode à l'instance:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    instance.mymethod = instancemethod(mymethod,instance)
    Ce serait peut-être plus rapide...

  6. #6
    Membre à l'essai
    Profil pro
    Inscrit en
    Septembre 2003
    Messages
    10
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations forums :
    Inscription : Septembre 2003
    Messages : 10
    Points : 11
    Points
    11
    Par défaut
    En voulant essayer cette nouvelle méthode, j'ai vu que j'avais fait une erreur en traduisant ma fonction vers la méthode de la classe enfant (myGeom). Ceci avait pour effet d'allourdir l'opération suivante. Le changement de classe n'était pas en cause pour le ralentissement.

    À mon grand bonheur, j'ai maintenant un code performant dans une structure élégante, c'est-à-dire sans fonction isolée. En plus, je connais deux façon d'y arriver (quoique je n'ai pas essayé la seconde).
    Merci

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

Discussions similaires

  1. Réponses: 2
    Dernier message: 03/09/2014, 14h00
  2. Réponses: 6
    Dernier message: 02/07/2014, 15h34
  3. créer une fiche a partir d'une autre fiche sous delphi
    Par fz.saida dans le forum Langage
    Réponses: 7
    Dernier message: 15/05/2013, 07h21
  4. Réponses: 4
    Dernier message: 21/04/2011, 08h31
  5. Nom d'instance de classe à partir d'une string
    Par nofasc95 dans le forum C#
    Réponses: 2
    Dernier message: 06/02/2009, 12h47

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