Visualizzazione dei risultati da 1 a 8 su 8
  1. #1

    [Python] Classi, Moduli e POO

    Salve a tutti, ho iniziato da un po' a programmare in python, e dopo l'entusiasmo dei primi script mi sono scontrato con la POO e l'uso delle classi.

    Io so già programmare in java e per istanziare un oggetto eseguivo la seguente procedura:
    1) creo classe A con relativi metodi
    2) creo classe B nella stessa cartella di A e da qualche parte faccio una cosa del tipo oggettoA=A() (poi dipende dal caso) e ci lavoro.

    La mia domanda è:
    E' possibile fare -più o meno- la stessa cosa con python?
    Ho tentato leggendo libri e guide ma non ho trovato risposte (o almeno, non quelle che cerco).

    Esempio di ciò che sto chiedendo:
    file A -> classe A -> metodi di A
    file B -> classe B -> istanzio oggetto A() -> uso A.

    Inoltre, ho un dubbio:
    Come avvio il programma?
    (So che è una domanda banalissima, ma mi sono incartato di brutto)

    Grazie.
    T.

  2. #2

    Re: [Python] Classi, Moduli e POO

    Originariamente inviato da TommyDelVed
    E' possibile fare -più o meno- la stessa cosa con python?
    Ho tentato leggendo libri e guide ma non ho trovato risposte (o almeno, non quelle che cerco).

    Esempio di ciò che sto chiedendo:
    file A -> classe A -> metodi di A
    file B -> classe B -> istanzio oggetto A() -> uso A.
    Certo... in file A metti la dichiarazione della tua classe
    codice:
    class ClasseA:
        def __init__(self):
            ...
        
        def metodo1(self, parametro):
            ...
    e lo salvi come classea.py; quindi nell'altro file fai
    codice:
    import classea
    
    ...
    
    a=classea.ClasseA()
    a.metodo1(...)
    ...
    Inoltre, ho un dubbio:
    Come avvio il programma?
    codice:
    python nomefile.py
    dove nomefile.py contiene le istruzioni da cui parte il programma.
    Amaro C++, il gusto pieno dell'undefined behavior.

  3. #3
    Ciao, ti ringrazio molto per la risposta.
    Ho provato a mettere in pratica quanto mi hai scritto in questo modo:

    codice:
    class Test:
    
    def __init__(self):         
    s1="aaa"         
    s2="bbb"   
       
    def setS1(self,s1):         
    self.s1=s1 
         
    def setS2(self,s2):         
    self.s2=s2    
      
    def stamp(self):         
    print(s1,s2)
    codice:
    import test  
    
    class UsoTest:   
      
    def prova():                
    a=test.Test()         
    a.stamp()
    E' giusto?
    Non ho messo "__init__" nella seconda classe perchè se non ho capito male va utilizzato solo se si istanzia un oggetto.

    Ad ogni modo, quando eseguo (premo f5 da idle) la classe UsoTest non accade nulla.
    Dove sbaglio?
    T.

  4. #4
    1. l'indentazione è tutta sbagliata... e in un linguaggio come Python se l'indentazione è sbagliata il codice non funzionerà nella maniera più assoluta...
    2. a differenza di Java, non serve piazzare tutto in classi... dato che UsoTest non deve essere istanziata, non serve neanche che esista;
    3. non c'è del codice al di fuori delle definizioni di funzioni/classi, quindi Python si limita a leggere queste definizioni e non fare nulla... se vuoi che faccia qualcosa eseguendo i file devi mettere il codice in questione al di fuori di ogni funzione/classe;
    4. per riferirti ai membri della classe devi sempre usare self... cosa che non fai in stamp

    Alla luce di questo:
    test.py
    codice:
    class Test:
        def __init__(self):         
            self.s1="aaa"
            self.s2="bbb"
    
        def setS1(self,s1):
            self.s1=s1 
    
        def setS2(self,s2):
            self.s2=s2
    
        def stamp(self):
            print(self.s1,self.s2)
    altrofile.py (o come si chiama)
    codice:
    import test
    
    a=test.Test()
    a.stamp()
    o, se preferisci,
    codice:
    import test
    
    def main():
        a=test.Test()
        a.stamp()
    
    main()
    Amaro C++, il gusto pieno dell'undefined behavior.

  5. #5
    Grazie per la risposta

    1. Conosco bene l'identazione, la uso anche dove non ' necessario (altri linguaggi), prima l'ho scritta così perchè ero di fretta e non ho controllato gli effetti del copia-incolla.


    2. Ah! Ma se io, ad esempio volessi fare un programma complesso, che comprende diversi file, dovrò pure avere il mio "public statric void main" no?
    Se non ho capito male in python basta fare un piccolo script che da il via a tutto, giusto?

    3. Got it!

    4. Grazie per la segnalazione


    Ho provato ad eseguire il codice con tutte le modifiche che mi ha consigliato, ma se non faccio (in grossetto)

    codice:
    import test  
    def main():     
    a=test.Test()     
    a.setS1("a")     
    a.setS2("b")      
    a.stamp()  
    main()
    mi ritorna questo errore:
    codice:
    Traceback (most recent call last):   
    File "C:/.../usotest.py", line 7, in <module>     
    main()   
    File "C:/.../usotest.py", line 5, in main     a.stamp()   
    File "C:/...\test.py", line 13, in stamp     print(self.s1,self.s2) 
    AttributeError: 'Test' object has no attribute 's1'
    Perchè?
    Non vorrei aver capito male, ma io s1 e s2 dovrei averl impostate con __init__ come "valore default", o no?
    T.

  6. #6
    Perché ho sbagliato a scrivere; anche nel costruttore è sempre self.s1 e self.s2, non s1/s2 e basta. Ora ho corretto sopra.
    1. Conosco bene l'identazione, la uso anche dove non ' necessario (altri linguaggi), prima l'ho scritta così perchè ero di fretta e non ho controllato gli effetti del copia-incolla.
    Ok, occhio comunque al copia-incolla, anche qui è sparita l'indentazione.
    2. Ah! Ma se io, ad esempio volessi fare un programma complesso, che comprende diversi file, dovrò pure avere il mio "public statric void main" no?
    Tipicamente in un file scrivi un main (come sopra: def main(): eccetera) e poi dici all'interprete di far partire il main lasciando in fondo al file principale la chiamata al main.
    Amaro C++, il gusto pieno dell'undefined behavior.

  7. #7
    Ah ok!
    Chiaro.
    In sintesi self va messo praticamente ovunque :P

    Avevo capito che con python 3 si voleva semplificare il codice, non potevano evitarci tutti questi self? :S

    Grazie mille comunque, sei stato gentilissimo!
    T.

  8. #8
    Originariamente inviato da TommyDelVed
    Ah ok!
    Chiaro.
    In sintesi self va messo praticamente ovunque :P
    self va messo sempre quando accedi ad un membro (metodo, campo o quel che sia) della classe (a differenza di altri linguaggi, dove this è facoltativo all'interno dei metodi della classe). In un certo senso è più logico.
    Grazie mille comunque, sei stato gentilissimo!
    Amaro C++, il gusto pieno dell'undefined behavior.

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2025 vBulletin Solutions, Inc. All rights reserved.