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

Tkinter Python Discussion :

Affichage d' une methode d' une classe externe


Sujet :

Tkinter Python

  1. #1
    Membre confirmé
    Inscrit en
    Septembre 2007
    Messages
    103
    Détails du profil
    Informations forums :
    Inscription : Septembre 2007
    Messages : 103
    Par défaut Affichage d' une methode d' une classe externe
    Développ/euses,eurs, Bonjour!

    j' essaie de comprendre les classes ... et le reste...

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    class classPref ( tk.Toplevel ) :
        def __init__ ( self ):
            tk.Toplevel.__init__ (self)
            ...
    J' appelle donc le constructeur de la classe Tkinter (import Tkinter as tk), soit.
    Mais j' aimerais bien savoir ce qu' il contient ce constructeur.
    Ma question est donc:
    Comment afficher le contenu d' une méthode externe comme celle-ci ?
    (Python 2.5.1).

    En vous remerciant

  2. #2
    Membre émérite
    Homme Profil pro
    Inscrit en
    Décembre 2007
    Messages
    758
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France

    Informations professionnelles :
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Décembre 2007
    Messages : 758
    Par défaut
    Bonjour,

    Il me semble qu'il y a quelques confusions dans les termes que tu emploies

    Tkinter est une librairie, pas une classe.

    importe le module Tkinter avec l'alias tk. en aucun cas c'est le constructeur d'une classe.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    class classPref ( tk.Toplevel ) :
        def __init__ ( self ):
            tk.Toplevel.__init__ (self)
    là tu crées une classe dérivée de tk.Toplevel et tu écris un constructeur (__init__, bien que je préfère appeler __new__ constructeur et __init__ initialiseur mais c'est juste mon point de vue).

    en dérivant de tk.Toplevel, tu appelles le __init__ de tk.Toplevel dans le __init__ de la classe dérivée et c'est bien ce qu'il faut faire.

    si tu veux savoir quels arguments tu peux passer à la méthode __init__ de tk.Toplevel:


  3. #3
    Membre Expert
    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    1 418
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 1 418
    Par défaut
    Salut,



    __init__() n’est pas un constructeur
    Je pense que cette appellation erronée pour __init()__ s’est répandue à cause d’une explication dans “Plonger dans Python“ qui, c’est le comble, cherchait à souligner que __init__() n’est pas un constructeur:

    http://diveintopython.adrahon.org/ob....html#d0e11779
    __init__ est appelé immédiatement après qu'une instance de la classe est créée. Il serait tentant mais incorrect de l'appeler le constructeur de la classe. Tentant, parce que ça ressemble à un constructeur (par convention, __init__ est la première méthode définie de la classe), ça se comporte comme un constructeur (c'est le premier morceau de code exécuté dans une nouvelle instance de la classe) et que ça sonne pareil («init» fait penser à quelque chose comme un constructeur). Incorrect, parce qu'au moment ou __init__ est appelé, l'objet à déjà été créé et que vous avez déjà une référence valide à la nouvelle instance de la classe. Mais __init__ est ce qui se rapproche le plus d'un constructeur en Python et remplit en gros le même rôle.
    ouhouhou non !!!!



    parce que:
    au moment ou __init__() est appelé, l'objet à déjà été créé
    Et d’après ce que j’ai compris de diverses lectures, il a été créé par allocation d’une zône de mémoire pour assurer son implémentation. C’est après cette allocation qu’entre en action __init__() pour inscrire dans cette zône mémoire des valeurs et les assigner à des attributs. Le véritable constructeur est donc le processus qui réalise l’allocation.

    Je n’ai pas vu d’explications sur ce processus dans les tutoriels et docs officiels de Python, on dirait qu’“ils“ tiennent à ce que ça reste ésotérique. Les seules explications que j’ai trouvées , c’est de temps à autre sur d’autres sites.

    Je n’ai pas encore compris suffisamment de choses sur ces questions pour prétendre affirmer quelque chose, mais je ne suis pas très sûr que ce soit __new__() qui mérite vraiment le nom de constructeur. En fait je n’en sais rien, je n'ai pas encore bien compris la fonction __new__(). On trouve très peu de choses sur __new__() aussi.

    J’ai trouvé ça qui semble intéressant
    http://code.activestate.com/recipes/303059/
    et aussi ça qui donne une astuce avec __call__() en rapport avec Tkinter
    http://www.daniweb.com/forums/thread39004.html#

    Mais il est clair que __init()__ n'est pas un constructeur. Comme kango, je l'appelle initialiseur.

  4. #4
    Membre confirmé
    Inscrit en
    Septembre 2007
    Messages
    103
    Détails du profil
    Informations forums :
    Inscription : Septembre 2007
    Messages : 103
    Par défaut
    Merci, merci !

    Kango :
    - je me suis mal exprimé en évoquant le "import Tkinter as tk" ... j'avais compris ce point. Je voulais donc bien parler de la ligne où j' appelle le __init__ de la classe tk.Toplevel.

    Le help() répond à ma question! Merci.


    Eyquem:
    merci pour la sémantique. J' ai relu aussi le "Swinnen" pge 161/162, qui peut paraître ambigu sur le fait que l'objet est déjà instancié ou pas ... mais bon ...

    Maintenant, ca aurait plus sa place dans la rubrique Tkinker, mais ca m'apporte quoi d' appeler le __init__ de tk.Toplevel ? Pourquoi ne pas faire :
    self.fen = tk.Toplevel (self, ...)
    qui permet au moins de l' avoir placé dans une variable réutilisable ?

    Bye

  5. #5
    Expert éminent
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 741
    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 741
    Par défaut tout dépend de ce qu'on veut...
    Maintenant, ca aurait plus sa place dans la rubrique Tkinker, mais ca m'apporte quoi d' appeler le __init__ de tk.Toplevel ? Pourquoi ne pas faire :
    self.fen = tk.Toplevel (self, ...)
    qui permet au moins de l' avoir placé dans une variable réutilisable ?
    C'est la conséquence de :
    Code python : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    class classPref ( tk.Toplevel ) :
        def __init__ ( self ):
    La déclaration de classPref comme classe dérivée de... et la convention d'appeler __init__ de la classe père dans ce cas.
    Dans ce cas, classPref est un tk.Toplevel et hérite de ses méthodes et variables.
    dans le cas self.fen = tk.Toplevel (self, ...), classPref a un lien avec tk.Toplevel qu'il pourra utiliser comme un quelconque attribut.

    -W
    Architectures post-modernes.
    Python sur DVP c'est aussi des FAQs, des cours et tutoriels

  6. #6
    Membre confirmé
    Inscrit en
    Septembre 2007
    Messages
    103
    Détails du profil
    Informations forums :
    Inscription : Septembre 2007
    Messages : 103
    Par défaut
    Ok, merci !!

    S-

  7. #7
    Membre Expert
    Avatar de DelphiManiac
    Homme Profil pro
    Homme à tout faire
    Inscrit en
    Mars 2002
    Messages
    1 147
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Homme à tout faire
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2002
    Messages : 1 147
    Par défaut
    Dans les langages que je connais, le terme de constructeur est employé pour nommer la méthode qui sert à initialiser l'instance d'une classe et non à allouer l'espace mémoire nécessaire à cette instance.

    __init__ est un constructeur si on s'en tiens à l'usage qu'est fais de cette notion dans la plupart des langages.

    Et toujours à ma connaissance, très peu de langages permettent de surcharger la méthode qui renvoi l'instance de l'objet qui doit être créée, ce que fais __new__ en python.

    voir -> http://en.wikipedia.org/wiki/Constru...ter_science%29 même si bien sûr wikipedia n'est pas une source sûre à 100%.

    et aussi -> http://docs.python.org/reference/datamodel.html#object.__init__
    où l'on peut lire : "As a special constraint on constructors, no value may be returned; doing so will cause a TypeError to be raised at runtime."

  8. #8
    Expert éminent
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 741
    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 741
    Par défaut
    Citation Envoyé par DelphiManiac Voir le message
    __init__ est un constructeur si on s'en tiens à l'usage qu'est fais de cette notion dans la plupart des langages.
    __init__ est appelé lorsqu'on crée un nouvelle instance de la classe comme le constructeur C++, par exemple.

    Et toujours à ma connaissance, très peu de langages permettent de surcharger la méthode qui renvoi l'instance de l'objet qui doit être créée, ce que fais __new__ en python.
    C++ permet de le faire.
    Python fait de la metaprogrammation: on peut associer a la classe une metaclass appelée avant __new__. Pour voir un joli exemple d'utilisation regardez dans le code d'Elixir ce qui a trait à la définition des classes associées aux tables (dérivée d'Entity).
    - W
    Architectures post-modernes.
    Python sur DVP c'est aussi des FAQs, des cours et tutoriels

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

Discussions similaires

  1. [Débutant] Appel d'une methode dans une methode
    Par yannoch123 dans le forum C#
    Réponses: 1
    Dernier message: 15/01/2014, 12h16
  2. Réponses: 7
    Dernier message: 17/01/2009, 13h10
  3. Recherche une valeur d'une cellule dans une colonne d'une autre feuille
    Par kourria dans le forum Macros et VBA Excel
    Réponses: 8
    Dernier message: 21/06/2007, 13h48
  4. Appliquer une methode a une variable d une classe ?
    Par Slumpy dans le forum VB.NET
    Réponses: 18
    Dernier message: 07/06/2007, 17h17
  5. Réponses: 11
    Dernier message: 05/10/2006, 13h20

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