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 :

appeler le résultat d'une fonction dans une classe [Python 3.X]


Sujet :

Python

  1. #1
    Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Mars 2012
    Messages
    63
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Mars 2012
    Messages : 63
    Points : 49
    Points
    49
    Par défaut appeler le résultat d'une fonction dans une classe
    Bonjour à tous , je suis pas habitué avec les class, du coups j'ai un petit soucis, j'arrive pas à récupérer les résultats
    d'une fonction que j'aurai besoin pour la suivante,
    j'ai testé toutes les fonctions est ça marche très bien , je voudrais les mettre dans une class
    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
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    import tkinter as tk
     
    fenetre = tk.Tk()
     
    class Informations(object):
     
     
        def __init__(self , fil,fig,imag):
            self.fig = fig
            self.imag = imag
            self.fil =fil
            self.nucl= tk.StringVar()
        def askopenfile(self):
     
            fil=filedialog.askopenfilename(initialdir = "/",title = "Select file",filetypes = (("xlsx files","*.xlsx"),("all files","*.*")))
            return fil
     
        def plot (self,fil):
     
            #file ='/Users/imed/Desktop/Radionucléide/Co60/export20190430_125508.xlsx'
            fil=filedialog.askopenfilename(initialdir = "/",title = "Select file",filetypes = (("xlsx files","*.xlsx"),("all files","*.*")))
     
            xl = pd.ExcelFile(sel)
            df1 = xl.parse('Spectre')
            coups=df1['Coups']
            energie=df1['Energie (keV)']
            fig = Figure()
            a = fig.add_subplot(111)
     
            a.plot(energie,coups,'k')
            a.vlines(x=energie,ymin=0,ymax=coups,color='black')
     
            imag = io.BytesIO()
            pyplot.savefig(imag, format='png')
            imag.seek(0)
            return(fig,imag,nucl)
     
        def learn(self,imag):
            model = load_model('/Users/imed/Desktop/new_model_200.h5')
            nucleide=['Mn','U','Cs','Am','Na','Co60','Y','Sr']
     
            img = image.load_img(imag, target_size=(128, 128))
     
            x = image.img_to_array(img)
            x = np.expand_dims(x, axis=0)
     
            images = np.vstack([x])
            classes = model.predict_classes(images/255)
            nucl= nucleide[classes[0]]
            return nucl
     
     
    info = Informations(fil,fig,imag)
    canvas = FigureCanvasTkAgg(info.fig, master=fenetre) 
    canvas.get_tk_widget().pack()
    canvas.draw()
    label = tk.Label(fenetre, textvariable=info.nucl)
    label.pack()
    button = Button (window, text="upload", command=info.askopenfile)
    button.pack()
    button1 = Button (window, text="plott", command=info.plot)
    button2 = Button (window, text="check", command=info.nucl)
    button1.pack()
    fenetre.mainloop()

  2. #2
    Expert éminent sénior
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 689
    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 689
    Points : 30 983
    Points
    30 983
    Billets dans le blog
    1
    Par défaut
    Bonjour

    Je ne comprends pas trop cette partie de phrase "d'une fonction que j'aurai besoin pour la suivante". La suivante quoi ? Une autre fonction ? Une autre classe ?

    Dans tous les cas, si tu veux stocker quelque chose dans une class (un objet), il faut assigner alors ce quelque chose à un attribut de l'objet

    Exemple 1
    Code python : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    class toto:
    	def xxx(self):
    		val=123				# La variable "val" ne sera connue que dans la méthode "xxx"
    	def yyy(self):
    		print(val)			# Ne fonctionne pas car "val" n'est pas connue

    Exemple 2
    Code python : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    class toto:
    	def xxx(self):
    		self.val=123			# Ici, la variable "val" devient un attribut à part entière de l'objet. Elle est donc connue de tout l'objet
    	def yyy(self):
    		print(self.val)			# Ok, l'attribut "val" est connu (à condition bien évidemment que "xxx()" ait été appelé !!!)
     
    a=toto()
    a.xxx()			# Pour charger "val"
    a.yyy()			# Affichera 123

    Tu peux bien évidemment remplacer 123 par ce que tu veux, y compris par une fonction appelée.

    Toutefois tout objet "toto" connait "val" et peut le modifier
    Code python : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    a=toto()
    a.xxx()			# Pour charger "val"
    a.yyy()			# Affichera 123
    print(a.val)		# Affichera aussi 123
    a.val=512		# Modifie l'attribut "val"
    print(a.val)		# Affichera 512
    a.yyy()			# Affichera aussi 512

    Ce comportement peut être dangereux. Donc si "val" est juste destiné au travail interne de l'objet (un calcul interne, une info qui serait transmise entre différentes méthodes) et qu'elle n'est pas destinée à être vue (et donc encore moins modifiée) de l'extérieur, alors tu peux la faire précéder de deux underscores. Dans ce cas, elle devient "privée" et n'est alors visible que (presque*) dans l'objet et pas du dehors
    Code python : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    class toto:
    	def xxx(self):
    		self.__val=123			# Ici, l'attribut "__val" est connu mais ne sera visible que dans l'objet
    	def yyy(self):
    		print(self.__val)		# Ok, on est toujours dans l'objet donc l'attribut "__val" reste connu
     
    a=toto()
    a.xxx()			# Pour charger "__val"
    print(a.val)		# Ne fonctionnera pas (l'objet n'a pas d'attribut "val")
    print(a.__val)		# Ne fonctionnera pas (l'attribut "__val" n'est connu que dans l'objet et pas du dehors)
    a.yyy()			# Affichera 123 (la méthode "yyy" fait partie de l'objet donc peut accéder à "__val"
    a.val=512		# Créera un nouvel attribut "val" qui n'a rien à voir avec "__val"
    print(a.val)		# Affichera 512
    a.yyy()			# Affichera toujours 123 (l'attribut "__val" reste protégé de l'extérieur)

    Ensuite on peut rajouter les getters et les setters qui permettent d'encapsuler la récupération/modification d'attributs privés dans des fonctions qui, vues de l'extérieur, se comportent comme des variables (écrire par exemple a.val=512 appellera une fonction spécifique dédiée à remplir l'attribut "__val" mais en contrôlant ce remplissage) mais tu verras ça un peu plus tard...

    (*) en fait, l'attribut "__val" est juste renommé en "__toto_val" donc celui qui connait cette subtilité peut quand-même y accéder du dehors mais cela n'est pas recommandé car ça détruit la portablilité (si demain le nom interne change dans la Vn+1, celui qui utilise ce nom depuis l'extérieur verra son programme ne plus fonctionner)
    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]

  3. #3
    Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Mars 2012
    Messages
    63
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Mars 2012
    Messages : 63
    Points : 49
    Points
    49
    Par défaut
    Merci pour votre réponse
    Citation Envoyé par Sve@r Voir le message
    La suivante quoi ? Une autre fonction ? Une autre classe ?
    je veux dire le résultat d'une méthode ou fonction est le paramètre de la fonction qui la suit

  4. #4
    Membre émérite

    Homme Profil pro
    Ingénieur calcul scientifique
    Inscrit en
    Mars 2013
    Messages
    1 229
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Ingénieur calcul scientifique

    Informations forums :
    Inscription : Mars 2013
    Messages : 1 229
    Points : 2 328
    Points
    2 328
    Par défaut
    Citation Envoyé par elmhmdi Voir le message
    Merci pour votre réponse


    je veux dire le résultat d'une méthode ou fonction est le paramètre de la fonction qui la suit
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    def ajoute2(a):
        return a+2
     
    def triple(a):
        return 3*a
     
     
    print( triple( ajoute2(5) ) )
    Ici le résultat de ajoute2(5) est passé en paramètre à la fonction triple.

  5. #5
    Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Mars 2012
    Messages
    63
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Mars 2012
    Messages : 63
    Points : 49
    Points
    49
    Par défaut
    Merci ça marche ,
    par contre j'ai un soucis avec
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    imag = io.BytesIO()
            pyplot.savefig(imag, format='png')
            imag.seek(0)
    l variable imag rest toujours invariable soit je fasse.
    je travaille avec la méthode qui donne comme
    sortie le chemin du fichier excel ,
    je fais le plotting puis je sauvegarde la figure dans une case mémoire,
    après je fais appel pour travailler avec.(je veux pas la sauvegarder sur la machine), elle
    mais cette variable ne change plus

  6. #6
    Expert éminent sénior
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 689
    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 689
    Points : 30 983
    Points
    30 983
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par elmhmdi Voir le message
    (je veux pas la sauvegarder sur la machine)
    Ben il me semble que matplotlib.pyplot.savefig() a justement pour but de sauvegarder l'image dans un fichier physique (fichier à passer en paramètre dans la méthode). Donc si le premier paramètre est sensé être un nom de fichier (une string donc), c'est peu probable que la fonction réussira à faire le travail avec un BytesIO (essaye de programmer un ersatz de fonction "savefig()" et tu verras immédiatement le souci...)

    Par exemple en codant ceci
    Code python : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    def savefig(f, txt):
    	with open(f, "w") as fp:
    		fp.write(txt + "\n")

    Ben si tu appelles savefig("toto", "Hello") ça marche très bien mais si tu appelles savefig(img, "Hello") (avec "img" comme un BytesIO) ça le fait de suite moins bien...
    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]

  7. #7
    Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Mars 2012
    Messages
    63
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Mars 2012
    Messages : 63
    Points : 49
    Points
    49
    Par défaut
    le premier paramètre est sensé être un nom de fichier (une string donc)
    si je me trompe pas le premier paramètre contient l'adresse de la mémoire

    voulez dire que je dois enregistrer la photo sous forme string ??

    j'ai réussi à mémoriser l'image dans la case mémoire , j'ai pu récupéré le contenu , mais si je veux modifier le contenu,
    j'arrive pas , à chaque fois je change l'image à sauvegarder je reçois toujours la première photo stocké,, j'arrive pas à l'écraser .

  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 689
    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 689
    Points : 30 983
    Points
    30 983
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par elmhmdi Voir le message
    si je me trompe pas le premier paramètre contient l'adresse de la mémoire
    Dans ce cas là, on ne parle pas de la même fonction. Moi je parlais ce celle-ci qui prend en premier paramètre un nom de fichier.

    Il faudrait que tu m'indiques plus précisément de laquelle tu parles toi...

    Citation Envoyé par elmhmdi Voir le message
    j'ai réussi à mémoriser l'image dans la case mémoire , j'ai pu récupéré le contenu , mais si je veux modifier le contenu,
    j'arrive pas , à chaque fois je change l'image à sauvegarder je reçois toujours la première photo stocké,, j'arrive pas à l'écraser .
    pareil, il faudrait plus de détail sur la façon que tu as de coder cet algo qui ressemble pourtant à une simple écriture d'infos sur disque...
    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. Réponses: 7
    Dernier message: 08/04/2018, 11h00
  2. Appel du résultat d'une macro dans une autre macro
    Par étudiant11 dans le forum Macro
    Réponses: 2
    Dernier message: 03/03/2015, 17h36
  3. [AC-2003] Récupérer le résultat de ma fonction dans une requête access
    Par PASINFO dans le forum VBA Access
    Réponses: 1
    Dernier message: 28/09/2010, 19h07
  4. Réponses: 1
    Dernier message: 01/06/2009, 10h56
  5. appel à une fonction dans la classe Action
    Par imane_bennouna dans le forum Struts 1
    Réponses: 3
    Dernier message: 07/08/2006, 11h09

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