User Tools

Site Tools


appunti3s:creare_classi_e_funzioni_in_python

Differences

This shows you the differences between two versions of the page.

Link to this comparison view

Both sides previous revisionPrevious revision
Next revision
Previous revision
appunti3s:creare_classi_e_funzioni_in_python [2020/06/08 22:19] – external edit 127.0.0.1appunti3s:creare_classi_e_funzioni_in_python [2020/07/29 18:42] (current) – [Parametri opzionali] profpro
Line 45: Line 45:
   * __attributi__ (dati e metodi) = tutto quello che viene dopo un punto (anche una funzione math.…).   * __attributi__ (dati e metodi) = tutto quello che viene dopo un punto (anche una funzione math.…).
     * __attributo dato__ = sono le variabili di un particolare oggetto istanza. Vivono nel namespace dell'oggetto istanza. Poiché in Python le variabili non si dichiarano in anticipo, nemmeno questi vengono dichiarati nella def della classe. Essi vengono dichiarati/inizializzati all'interno del costruttore %%__init__()%%.     * __attributo dato__ = sono le variabili di un particolare oggetto istanza. Vivono nel namespace dell'oggetto istanza. Poiché in Python le variabili non si dichiarano in anticipo, nemmeno questi vengono dichiarati nella def della classe. Essi vengono dichiarati/inizializzati all'interno del costruttore %%__init__()%%.
-    * __attributo metodo__ = sono le funzioni di un particolare oggetto istanza. Vivono nel namespace dell'oggetto istanza. Vengono definite dentro il namespace della classe e il loro primo attributo deve essere sempre //self//, il riferimento all'oggetto su cui sono state chiamate. Per la stessa ragione, quando in un metodo si chiama un altro medoto o si usa un //attributo dato//, si deve aggiungere il prefisso "//self.//attributo"Si può chiamare oggetto.metodo(), o equivalentemente, Classe.metodo(oggetto).+    * __attributo metodo__ = sono le funzioni di un particolare oggetto istanza. Vivono nel namespace dell'oggetto istanza. Vengono definite dentro il namespace della classe e il loro primo attributo deve essere sempre //self//, il riferimento all'oggetto su cui sono state chiamate. Per la stessa ragione, quando in un metodo si chiama un altro medoto o si usa un //attributo dato//, si deve aggiungere il prefisso "//self.//attributo"Nei linguaggi orientati agli oggetti, quindi anche in Python, solitamente, si può chiamare //oggetto.metodo()//ma in Python è possibile anche usare la chiamata del tipo: //Classe.metodo(oggetto)//.
     * in Python è possibile rinominare i metodi (detti attributi metodi) perciò nella classe bisogna evitare conflitti di nome tra dati e funzioni. Si possono usare sostantivi per i primi e verbi per i secondi...     * in Python è possibile rinominare i metodi (detti attributi metodi) perciò nella classe bisogna evitare conflitti di nome tra dati e funzioni. Si possono usare sostantivi per i primi e verbi per i secondi...
  
 Nota: //self// non è una keyword del linguaggio Python, ma il suo uso è una vecchia consuetudine e cambiarla sarebbe poco utile... Nota: //self// non è una keyword del linguaggio Python, ma il suo uso è una vecchia consuetudine e cambiarla sarebbe poco utile...
  
 +Nota2: In Python, un attributo metodo è a sua volta manipolabile come un "oggetto", quindi possiede attributi.
 ===== Namespace ===== ===== Namespace =====
    
-TO DO: Come si divide il codice in più file.py?+Come si divide il codice in più file.py? Ogni file .py può essere importato (import) [[appunti3s:modulo python]] 
 + 
 +Questi moduli python sono salvati nella sottocartella "lib"
  
 La keyword //global// si usa per definire oggetti globali (meglio usarla solo per le funzioni) La keyword //global// si usa per definire oggetti globali (meglio usarla solo per le funzioni)
Line 77: Line 80:
 Questa classe servirà al futuro **programmatore** per creare, ogni volta che serve, un oggetto auto.  Questa classe servirà al futuro **programmatore** per creare, ogni volta che serve, un oggetto auto. 
 Il programmatore, per creare il primo oggetto può scrivere semplicemente: Il programmatore, per creare il primo oggetto può scrivere semplicemente:
-<code>auto1 = Auto()</code>+<code>auto1 = Auto() 
 + 
 +auto1.__class__  #stampa la classe di appartenenza di oggetto auto1 
 + 
 +auto1.__doc__ #stampa la documentazione  </code> 
 Ora nella memoria del computer c'è una auto, ma è strana perché non si conosce nulla di quest'auto, come la targa, il prezzo, ecc. Ora nella memoria del computer c'è una auto, ma è strana perché non si conosce nulla di quest'auto, come la targa, il prezzo, ecc.
 Come può il futuro programmatore memorizzare la targa, il prezzo e i restanti attributi di questa auto? Li può specificare tra parentesi in questo modo: Come può il futuro programmatore memorizzare la targa, il prezzo e i restanti attributi di questa auto? Li può specificare tra parentesi in questo modo:
Line 92: Line 100:
 </file> </file>
  
-%%__init__()%% è un //attributo metodo// (una funzione) che descrive gli //attributi dato// e la loro inizializzazione. È uno degli attributi metodo più importanti che lo sviluppatore deve preparare. Il programmatore lo usa (senza saperlo) ogni volta che crea un oggetto. +  - Riassumendo: %%__init__()%% è un //attributo metodo// (una funzione) che descrive gli //attributi dato// e la loro inizializzazione. È uno degli attributi metodo più importanti che lo sviluppatore deve preparare. Il programmatore lo usa (senza saperlo) ogni volta che crea un oggetto. Non è necessario invocare esplicitamente %%__init__%%. Init non deve e non può restituire nulla.
 Notare che mentre la chiamata del metodo contiene 3 parametri, nella funzione %%__init__()%% ce ne sono 4... Notare che mentre la chiamata del metodo contiene 3 parametri, nella funzione %%__init__()%% ce ne sono 4...
 Notare anche l'ordine dei parametri tra parentesi.  Notare anche l'ordine dei parametri tra parentesi. 
 +
 +==== Parametri opzionali ====
 +Nel caso in cui chi usa la classe Auto non fornisca la targa, si può attribuirle un valore predefinito.
 +In caso contrario si solleverebbe un'eccezione a causa di una variabile senza valore...
 +
 +    def __init__(self, targa="0000000", km, prezzo):
  
 ==== Esempio 2 da terminare ==== ==== Esempio 2 da terminare ====
Line 122: Line 136:
         return __saldo         return __saldo
 </code> </code>
 +
 <file python bind01.py> <file python bind01.py>
 #!/usr/bin/python #!/usr/bin/python
 +import tkinter as tk
  
-class ContoCorrente: +class ContoCorrente(tk.Frame)
-"""questa classe e' solo un esempio didattico""" +    """questa classe e' solo un esempio didattico""" 
-# gli attributi vanno cercati, perche' si trovano sparsi dentro i metodi +    # gli attributi vanno cercati, perche' si trovano sparsi dentro i metodi 
-# ad esempio , due attributi sono i due pulsanti +    # ad esempio , due attributi sono i due pulsanti
     def __init__(self, master):     def __init__(self, master):
-                               +        super().__init__(master) 
-        frame = Frame(master, bg='white', width=200, height=200)  +        self.master = master 
-                          # container bianco # e' una var. locale di una funzione  +        self.pack() 
-                          # non viene distrutta solo grazie ad un sistema di Tkinter  +        self.creare()
-                          # che la mantiene in vita..+
-        frame.bind("<Button-1>", self.say_click# evento del click +
-        frame.pack() # deve essere l'ultima cosa da fare su frame?+
  
-    def say_click(self, event):       # metodo di app +    def creare(self): 
-        print "clicked at", event.x, event.y     +        self.var_oggetto = tk.Button(self) 
 +        self.var_oggetto["text"] = "(cliccami)" 
 +        self.var_oggetto.bind('<Button-1>', self.stampaclick) # evento del click 
 +        self.var_oggetto.pack(side="top"
 + 
 +    def stampaclick(self,event):       # metodo di app 
 +        print("cliccato a ", event.x, event.y )    
 +     
 +def main(): 
 +    root = tk.Tk()                # crea la finestra genitore 
 +    root.geometry("250x250+300+300"
 +    app = ContoCorrente(root) # crea altri elementi della finestra genitore 
 +    root.mainloop() # loop degli eventi eseguito fino alla chiusura
  
 # programma  # programma 
- +if __name__ == '__main__': 
-root Tk()                # crea la finestra genitore +    main()
-root.geometry("250x250+300+300"+
- +
-app App(root) # crea altri elementi della finestra genitore +
- +
-root.mainloop() # loop degli eventi eseguito fino alla chiusura+
  
 </file> </file>
appunti3s/creare_classi_e_funzioni_in_python.1591647599.txt.gz · Last modified: 2020/06/08 22:19 by 127.0.0.1