Torna indietro   Hardware Upgrade Forum > Software > Programmazione

Reno16 Pro: il compatto di OPPO punta su fotocamera da 200MP e il nuovo Bubble! La recensione
Reno16 Pro: il compatto di OPPO punta su fotocamera da 200MP e il nuovo Bubble! La recensione
OPPO ha portato in Italia, dal 1° luglio 2026, Reno16 Pro: display AMOLED da 6,32 pollici a 144Hz, tripla fotocamera con sensore principale da 200 megapixel, chip Dimensity 8550 Super e batteria da 6000mAh, al prezzo di lancio di 899 euro. Lo abbiamo provato per due settimane insieme al nuovo accessorio Bubble, per capire se la formula compatta della serie regge ancora di fronte a un listino da 1099 euro
 Hisense 55U7SE: tuttofare e accessibile, il MiniLED per film, sport e gioco
Hisense 55U7SE: tuttofare e accessibile, il MiniLED per film, sport e gioco
MiniLED di fascia media con local dimming a 192 zone, 144 Hz nativi e audio firmato Devialet. La prova strumentale riscontra colori affidabili e gaming reattivo, per un prodotto molto accessibile e convincente. Ma la soundbar aggiuntiva è quasi d'obbligo
Kindle Scribe Colorsoft: riduce le cornici e diventa a colori, ma il prezzo è alto
Kindle Scribe Colorsoft: riduce le cornici e diventa a colori, ma il prezzo è alto
Amazon porta i colori sul suo Kindle da scrittura più grande: schermo Colorsoft a 11 pollici, processore quad-core, penna premium più reattiva e strumenti IA per le note, sono le note salienti. Il salto di prezzo rispetto al modello in bianco e nero si fa sentire, anche se la percezione è quella di trovarsi di fronte a un prodotto di fascia altissima, per veri appassionati
Tutti gli articoli Tutte le news

Vai al Forum
Rispondi
 
Strumenti
Old 23-10-2012, 17:51   #1
kwb
Senior Member
 
L'Avatar di kwb
 
Iscritto dal: Jul 2003
Città: Alessandria
Messaggi: 10167
[Python] Classi, oggetti e self

Sto facendo un programma per gestire un'ipotetica biblioteca.
Ho un dubbio sulla parola chiave self:
Uno sguardo a questo stralcio di codice:
Codice:
class floor():
    
    __closet=[]
    __floorNumber=0

    def __init__(self, closetNumber, n):
        self.__floorNumber=n
        self.__closet.append(closetNumber)
        
    def addBook(self,bookObj,closetNumber,shelfNumber):
        for i in range(len(self.__closet)):
            if self.__closet[i].getClosetNumber()== closetNumber:
                self.__closet[closetNumber].addBook(bookObj,shelfNumber)
Possibile che io debba sempre usare self davanti ad ogni variabile della classe? È veramente scomodo, in Java non era così...

EDIT: Una domanda ulteriore sull'import: ho letto in giro che l'import non funziona bene su sistemi Mac OS e Windows nel caso in cui si importi un modulo che ha un'importazione al suo interno, nello specifico:
Codice:
from modulo import *
importerebbe solo i metodi della classe 'modulo' ma non i metodi ereditati da 'modulo' tramite una import dentro di se.
È vero?
__________________
Dell XPS 13 (9350) :: i5-2500K - HD6870 - AsRock Z68 Pro3 - Corsair Vengeance 8GB (4x2) DDR3 :: Samsung Galaxy S4 GT-i9505

Ultima modifica di kwb : 23-10-2012 alle 17:59.
kwb è offline   Rispondi citando il messaggio o parte di esso
Old 23-10-2012, 22:54   #2
ingframin
Senior Member
 
L'Avatar di ingframin
 
Iscritto dal: Apr 2010
Città: Leuven
Messaggi: 667
Quote:
Originariamente inviato da kwb Guarda i messaggi
Codice:
class floor():
    
    __closet=[]
    __floorNumber=0

    def __init__(self, closetNumber, n):
        self.__floorNumber=n
        self.__closet.append(closetNumber)
        
...
Possibile che io debba sempre usare self davanti ad ogni variabile della classe? È veramente scomodo, in Java non era così...
Attento perché così stai facendo un po'di confusione:
__closet=[] e __floorNumber=0 come l'hai create tu non sono variabili di istanza ma di classe (come se in Java tu ci avessi messo davanti static).
Per renderle variabili di istanza cancella la dichiarazione fuori dall'__init__.

self. va apposto a tutte le variabili di istanza e a tutti i metodi che richiami nella classe ed è il puntatore all'istanza specifica.

Non ho mai avuto problemi con from modulo import *, sia su linux che su windows, sei sicuro che non sia un bug di qualche versione precedente alla 2.7.3?
__________________
L'elettronica digitale non esiste, è solo elettrotecnica con interruttori piccoli!
ingframin è offline   Rispondi citando il messaggio o parte di esso
Old 23-10-2012, 23:15   #3
kwb
Senior Member
 
L'Avatar di kwb
 
Iscritto dal: Jul 2003
Città: Alessandria
Messaggi: 10167
Quote:
Originariamente inviato da coffe_killer Guarda i messaggi
io sto programmando in python indifferentemente sia su ubuntu sia su windows senza problemi di compatibilità, è il vantaggio dei linguaggi interpretati...il problema arriva quando hai bisogno di una libreria comptibile solo con alcuni SO e nn altri....x esempio il modulo BeautifulSoup non è compatibile con windows...basta che fai però una rapida ricerca su google e scopri subito le comptibilità e ti tolgi tutti i dubbi
Quote:
Originariamente inviato da ingframin Guarda i messaggi

Non ho mai avuto problemi con from modulo import *, sia su linux che su windows, sei sicuro che non sia un bug di qualche versione precedente alla 2.7.3?
Bho era una cosa che avevo letto di sfuggita su internet cercando informazioni sull'import.
Una cosa che mi aspettavo di poter fare era la seguente: nel main importo il modulo floor ( from floor import * ) e se dentro floor ho già importato altri moduli, mi aspettavo di poterli usare anche dal main, ma non è così...

Quote:
Originariamente inviato da ingframin Guarda i messaggi
Attento perché così stai facendo un po'di confusione:
__closet=[] e __floorNumber=0 come l'hai create tu non sono variabili di istanza ma di classe (come se in Java tu ci avessi messo davanti static).
Per renderle variabili di istanza cancella la dichiarazione fuori dall'__init__.
Ma se voglio dichiarare una variabile privata ( non accessibili da moduli esterni ) non devo usare __ davanti alla variabile? Come faccio a dichiarare una variabile privata, così come si farebbe in java:
Codice:
private int n;
E se poi non la voglio inizializzare ( e quindi non metterla nel costruttore )?

Da quel che mi hai detto, ho capito che le variabili le dichiaro private solo dentro il costruttore ( anche se, è vero, non esiste una vera e propria dichiarazione delle variabili in python )

Quote:
Originariamente inviato da ingframin Guarda i messaggi
self. va apposto a tutte le variabili di istanza e a tutti i metodi che richiami nella classe ed è il puntatore all'istanza specifica.
Quindi, siccome io voglio dichiarare quelle variabili come private, i self che ho messo sono giusti no?
Non funziona come il this. di java?
__________________
Dell XPS 13 (9350) :: i5-2500K - HD6870 - AsRock Z68 Pro3 - Corsair Vengeance 8GB (4x2) DDR3 :: Samsung Galaxy S4 GT-i9505
kwb è offline   Rispondi citando il messaggio o parte di esso
Old 24-10-2012, 05:28   #4
Eln
Member
 
Iscritto dal: Jul 2009
Messaggi: 72
Fai un pò di confusione, il this in Java veniva usato per richiamare un attributo/variabile (chiamala come vuoi) d'istanza, stessa cosa qui vale per il self. Servono esattamente alla stessa cosa.

La differenza è che in Java esistono i modificatori d'accesso, private ecc, cosa che in Python non c'è. Porre un _ d'avanti ad una variabile serve a far vedere agli altri, per convenzione, che quell'attributo è privato e quindi non dovrebbero accedervi direttamente (senza metodo get/set per capirci) e se lo fanno è a loro rischio e pericolo.

Come ti hanno scritto sotto quello che dovresti fare è mettere i tuoi attributi d'istanza nel Costruttore, ponendo un _ prima di quelli che vuoi indicare come privati. Fuori invece metti le variabili di classe, costanti, che infatti anche in Java si inizializzano fuori dal costruttore.
Eln è offline   Rispondi citando il messaggio o parte di esso
Old 24-10-2012, 05:46   #5
cdimauro
Senior Member
 
L'Avatar di cdimauro
 
Iscritto dal: Jan 2002
Città: Germania
Messaggi: 26110
Esattamente, il _ davanti è per lo più una convenzione: "è roba mia, interna, per favore non toccarla". Ma nessuno t'impedisce di metterci le mani, perché non esiste nella maniera più assoluta il concetto di privato, protetto, pubblico.

Ma attenzione quando si importa tutto da un modulo con la sintassi from Modulo import *. In questo caso Python non importa tutti gli identificatori del modulo, ma soltanto quelli che NON iniziano con _. In pratica chi ha realizzato il modulo può decidere cosa far importare automaticamente e cosa no; un meccanismo più fine è rappresentato dall'uso della variabile __all__ .

Ovviamente non c'è alcun problema coi moduli rispetto al s.o. su cui gira Python.

Riguardo a self & this, anche qui ci sono differenze con gli altri linguaggi. All'interno di una funzione definita in una classe (che diventa un metodo a tutti gli effetti, se non viene "decorata" opportunamente per farla diventare metodo di classe o funzione statica; ma di questo non ne parliamo per ora), qualunque assegnazione produce una variabile locale alla funzione.

Se vogliamo creare, modificare, o semplicemente accedere a una variabile d'istanza, bisogna sempre utilizzare self.Variabile. Non è come negli altri linguaggi a oggetti, dove il self/this è implicitamente sempre presente; qui è obbligatorio, perché fa fede il motto di Python (explicit is better than implicit).

E' noioso scrivere sempre self.? Può darsi, ma il codice è più leggibile. Ciò detto, se il problema è il morbo dello scrivano, si può usare un qualunque altro identificatore al posto di self:
Codice:
class c:
  def m(s):
    s.VariabileDIstanza = 'Hello!'
Meno caratteri da digitare, ma è una pratica che sconsiglio: il codice Python è bello anche perché è leggibile; non "sporchiamolo".
__________________
Per iniziare a programmare c'è solo Python con questo o quest'altro (più avanzato) libro
@LinkedIn Non parlo in alcun modo a nome dell'azienda per la quale lavoro
Ho poco tempo per frequentare il forum; eventualmente, contattatemi in PVT o nel mio sito. Fanboys
cdimauro è offline   Rispondi citando il messaggio o parte di esso
Old 24-10-2012, 10:02   #6
kwb
Senior Member
 
L'Avatar di kwb
 
Iscritto dal: Jul 2003
Città: Alessandria
Messaggi: 10167
Quote:
Originariamente inviato da Eln Guarda i messaggi
Fai un pò di confusione, il this in Java veniva usato per richiamare un attributo/variabile (chiamala come vuoi) d'istanza, stessa cosa qui vale per il self. Servono esattamente alla stessa cosa.

La differenza è che in Java esistono i modificatori d'accesso, private ecc, cosa che in Python non c'è. Porre un _ d'avanti ad una variabile serve a far vedere agli altri, per convenzione, che quell'attributo è privato e quindi non dovrebbero accedervi direttamente (senza metodo get/set per capirci) e se lo fanno è a loro rischio e pericolo.
A me non interessa niente delle questioni etiche o morali che si possono celare dietro un _ . Semplicemente ho fatto così perchè quando ho iniziato la programmazione ad oggetti mi è stato spiegato di dichiarare ( salvo speciali eccezioni ) le variabili di una classe come private e fare il metodo per impostarle/stamparle. Ora da quello che ho letto rapidamente sul sito ufficiale, questo concetto pare non esistere ( o essere radicato ) come è per Java.
Quindi la domanda è: un programmatore che scrive in Python, come le deve gestire le variabili che dichiara di una classe?

Quote:
Originariamente inviato da Eln Guarda i messaggi
Come ti hanno scritto sotto quello che dovresti fare è mettere i tuoi attributi d'istanza nel Costruttore, ponendo un _ prima di quelli che vuoi indicare come privati. Fuori invece metti le variabili di classe, costanti, che infatti anche in Java si inizializzano fuori dal costruttore.
Ma quindi invece di inizializzarle a 0 fuori dal costruttore e poi impostarle al valore scelto col costruttore, le sparo dirette dentro il costruttore con un underscore davanti? Oppure 2 (underscore)?

Quote:
Originariamente inviato da cdimauro Guarda i messaggi
Ma attenzione quando si importa tutto da un modulo con la sintassi from Modulo import *. In questo caso Python non importa tutti gli identificatori del modulo, ma soltanto quelli che NON iniziano con _. In pratica chi ha realizzato il modulo può decidere cosa far importare automaticamente e cosa no; un meccanismo più fine è rappresentato dall'uso della variabile __all__ .
Quindi mi pare di capire che le mie variabili che ho dichiarato tutte con un __ non saranno affatto visibili dentro altri moduli, no? Non è un po' il comportamento che si ottiene tramite il private di Java?

Quote:
Originariamente inviato da cdimauro Guarda i messaggi
E' noioso scrivere sempre self.? Può darsi, ma il codice è più leggibile. Ciò detto, se il problema è il morbo dello scrivano, si può usare un qualunque altro identificatore al posto di self:
Codice:
class c:
  def m(s):
    s.VariabileDIstanza = 'Hello!'
Meno caratteri da digitare, ma è una pratica che sconsiglio: il codice Python è bello anche perché è leggibile; non "sporchiamolo".
Fammi capire, quindi mi basta impostare come primo parametro un qualuque carattere per renderlo equivalente al self.?
Se così fosse andremmo moooolto meglio
__________________
Dell XPS 13 (9350) :: i5-2500K - HD6870 - AsRock Z68 Pro3 - Corsair Vengeance 8GB (4x2) DDR3 :: Samsung Galaxy S4 GT-i9505
kwb è offline   Rispondi citando il messaggio o parte di esso
Old 24-10-2012, 10:24   #7
banryu79
Senior Member
 
L'Avatar di banryu79
 
Iscritto dal: Oct 2007
Città: Padova
Messaggi: 4131
Quote:
Originariamente inviato da kwb Guarda i messaggi
Fammi capire, quindi mi basta impostare come primo parametro un qualuque carattere per renderlo equivalente al self.?
Se così fosse andremmo moooolto meglio
Un consiglio spassionato (basato sulla mia esperienza). Quando studi per imparare un nuovo linguaggio, tenta sempre di:
1) dimenticare le idiosincrasie di altri linguaggi che già conosci;
2) rispettare le convenzioni e gli idiomi del nuovo linguaggio;
3) cercarne di capire le ragioni (col tempo & esperienza).

Ho trovato questo atteggiamento molto utile.
__________________

As long as you are basically literate in programming, you should be able to express any logical relationship you understand.
If you don’t understand a logical relationship, you can use the attempt to program it as a means to learn about it.
(Chris Crawford)

Ultima modifica di banryu79 : 24-10-2012 alle 10:27.
banryu79 è offline   Rispondi citando il messaggio o parte di esso
Old 24-10-2012, 11:07   #8
cdimauro
Senior Member
 
L'Avatar di cdimauro
 
Iscritto dal: Jan 2002
Città: Germania
Messaggi: 26110
Quote:
Originariamente inviato da kwb Guarda i messaggi
A me non interessa niente delle questioni etiche o morali che si possono celare dietro un _ . Semplicemente ho fatto così perchè quando ho iniziato la programmazione ad oggetti mi è stato spiegato di dichiarare ( salvo speciali eccezioni ) le variabili di una classe come private e fare il metodo per impostarle/stamparle. Ora da quello che ho letto rapidamente sul sito ufficiale, questo concetto pare non esistere ( o essere radicato ) come è per Java.
Infatti (e per fortuna ) NON è Java.
Quote:
Quindi la domanda è: un programmatore che scrive in Python, come le deve gestire le variabili che dichiara di una classe?
Come ritieni più opportuno. Il che significa che spesso un programmatore Python le dichiara:
- nell'__init__ se serve che siano sempre inizializzate, magari con valori di default;
- all'interno di altri metodi.

Non siamo forzati a impostare le variabili d'istanza per forza nel costruttore, insomma. Lo facciamo quando lo riteniamo più opportuno.

In altri casi è possibile definire delle property, Delphi/C# like per intenderci, e quindi controllare l'accesso di una variabile d'istanza tramite getter e/o setter e/o deleter.
Quote:
Ma quindi invece di inizializzarle a 0 fuori dal costruttore e poi impostarle al valore scelto col costruttore, le sparo dirette dentro il costruttore con un underscore davanti? Oppure 2 (underscore)?
Io raramente uso l'underscore come prefisso di una variabile d'istanza. La dichiaro direttamente col nome che deve avere.
Quote:
Quindi mi pare di capire che le mie variabili che ho dichiarato tutte con un __ non saranno affatto visibili dentro altri moduli, no? Non è un po' il comportamento che si ottiene tramite il private di Java?
No, non è così. Se c'è un _ davanti, le variabili non saranno importabili direttamente tramite from Modulo import *, ma rimangono sempre accessibili:
Codice:
Modulo._NonSonoInvisibile = True
Oppure:
Codice:
from Modulo import _NonSonoInvisibile

_NonSonoInvisibile = True
Quote:
Fammi capire, quindi mi basta impostare come primo parametro un qualuque carattere per renderlo equivalente al self.?
Se così fosse andremmo moooolto meglio
Sì, esatto, ma non troverai un solo programmatore Python che lo faccia.

Siamo una setta di integralisti votati alla leggibilità del sorgente.
Quote:
Originariamente inviato da banryu79 Guarda i messaggi
Un consiglio spassionato (basato sulla mia esperienza). Quando studi per imparare un nuovo linguaggio, tenta sempre di:
1) dimenticare le idiosincrasie di altri linguaggi che già conosci;
2) rispettare le convenzioni e gli idiomi del nuovo linguaggio;
3) cercarne di capire le ragioni (col tempo & esperienza).

Ho trovato questo atteggiamento molto utile.
Sante parole.
__________________
Per iniziare a programmare c'è solo Python con questo o quest'altro (più avanzato) libro
@LinkedIn Non parlo in alcun modo a nome dell'azienda per la quale lavoro
Ho poco tempo per frequentare il forum; eventualmente, contattatemi in PVT o nel mio sito. Fanboys
cdimauro è offline   Rispondi citando il messaggio o parte di esso
Old 24-10-2012, 13:06   #9
kwb
Senior Member
 
L'Avatar di kwb
 
Iscritto dal: Jul 2003
Città: Alessandria
Messaggi: 10167
Ho provato un po' a giocare con queste cose. Ma non ho ben afferrato come sono riuscito ( e se ci sono riuscito ) a fare una lista di oggetti ( 2 ) che contenesse un'altra lista di oggetti.
Ad esempio, il main:
Codice:
from floor import *
from book import *
#Initialize the array
piano=[]

for i in range(2): #Use 2 floors
    tempFloor=floor(0,i)
    piano.append(tempFloor)

libroProva = book("Isaac Asimov","Cronache della Galassia")
#piano[0].addBook(book,1,1)
C'è questa classe floor che dovrebbe rappresentare il piano della biblioteca.
Su ogni piano della biblioteca ci devono essere un tot di armadi ( il cui numero è ancora da definire ), e poi per ogni armadio ci dovranno essere scaffali ecc... ( ma ancora non ci sono arrivato ).
Quello che ho fatto è stato creare una lista piano. Tramite il for creo degli oggetti piano temporanei ( tempFloor ) che inserisco dentro la lista piano.
Ora la classe floor:
Codice:
class floor():

    def __init__(self, closetNumber, n):
        self._closet=[]
        self._closet.append(closetNumber)
        self._floorNumber=n
        
    def addBook(self,bookObj,closetNumber,shelfNumber):
        for i in range(len(self._closet)):
            if self._closet[i].getClosetNumber()== closetNumber:
                return self._closet[closetNumber].addBook(bookObj,shelfNumber)
        return False
Siccome ho una classe che si chiama closet, ho preferito chiamare la variabile con un underscore davanti.
Tuttavia, mi aspettavo che scrivendo:
Codice:
def __init__(self, closetNumber, n):
        self._closet.append(closetNumber)
        self._floorNumber=n
Funzionasse, in realtà non va. Credo perchè non ho mai specificato cos è _closet. Inoltre utilizzare self. o meno non da errori sintattici, però credo di doverlo mettere, anche se non capisco veramente il perchè..

Premesso che _closet è una lista di numeri ( poi lo trasformerò in oggetto, tramite la sua classe ), sono riuscito a creare la seguente struttura ( che dura fino alla fine dell'esecuzione del programma )?
Codice:
piano[0]:
	closet[0]
piano[1]:
	closet[0]
EDIT: Dal debugger mi pare di si, ma vorrei avere conferma da voi anche.
__________________
Dell XPS 13 (9350) :: i5-2500K - HD6870 - AsRock Z68 Pro3 - Corsair Vengeance 8GB (4x2) DDR3 :: Samsung Galaxy S4 GT-i9505

Ultima modifica di kwb : 24-10-2012 alle 13:08.
kwb è offline   Rispondi citando il messaggio o parte di esso
Old 24-10-2012, 13:30   #10
ingframin
Senior Member
 
L'Avatar di ingframin
 
Iscritto dal: Apr 2010
Città: Leuven
Messaggi: 667
Se ci scrivi il testo dell'esercizio per come lo hai concepito proviamo a farlo e poi ci scambiamo i sorgenti completi.
ti va?
__________________
L'elettronica digitale non esiste, è solo elettrotecnica con interruttori piccoli!
ingframin è offline   Rispondi citando il messaggio o parte di esso
Old 24-10-2012, 15:41   #11
kwb
Senior Member
 
L'Avatar di kwb
 
Iscritto dal: Jul 2003
Città: Alessandria
Messaggi: 10167
La biblioteca è composta da:
- 2 piani
- Per ogni piano vi sono, diciamo, 5 armadi
- Per ogni armadio vi sono 5 scaffali
- Per ogni ripiano ci sono 10 libri

Dal main si chiama il metodo addBook che aggiunge l'oggetto book alla libreria, nella posizione indicata dai parametri ( specificando il piano ):
Codice:
piano[0].addBook(oggetto_Book,NumeroArmadio,NumeroMensola)
addBook è un metodo presente nelle classi:
floor, closet e shelf.
Vi è una classe aggiuntiva, book che contiene, oltre al titlo e l'autore ( inizializzati tramite costruttore alla creazione dell'oggetto libro ) anche i metodi set/get per impostare il piano/armadio/scaffale a cui si trova e l'anno di pubblicazione del libro.
__________________
Dell XPS 13 (9350) :: i5-2500K - HD6870 - AsRock Z68 Pro3 - Corsair Vengeance 8GB (4x2) DDR3 :: Samsung Galaxy S4 GT-i9505
kwb è offline   Rispondi citando il messaggio o parte di esso
Old 24-10-2012, 16:11   #12
banryu79
Senior Member
 
L'Avatar di banryu79
 
Iscritto dal: Oct 2007
Città: Padova
Messaggi: 4131
Altro consiglio (non richiesto, lo so) spassionato:
Scrivi il sorgente (i nomi delle variabili e dei tipi custom) in una sola lingua, o inglese o italiano o altro (la regola sarebbe usare la ingua franca dell'informatica: l'inglese).
Altrimenti vien fuori un pasticcio (dal punto di vista della leggibilità del codice e della facilità di comprensione)
__________________

As long as you are basically literate in programming, you should be able to express any logical relationship you understand.
If you don’t understand a logical relationship, you can use the attempt to program it as a means to learn about it.
(Chris Crawford)
banryu79 è offline   Rispondi citando il messaggio o parte di esso
Old 24-10-2012, 16:14   #13
kwb
Senior Member
 
L'Avatar di kwb
 
Iscritto dal: Jul 2003
Città: Alessandria
Messaggi: 10167
Quote:
Originariamente inviato da banryu79 Guarda i messaggi
Altro consiglio (non richiesto, lo so) spassionato:
Scrivi il sorgente (i nomi delle variabili e dei tipi custom) in una sola lingua, o inglese o italiano o altro (la regola sarebbe usare la ingua franca dell'informatica: l'inglese).
Altrimenti vien fuori un pasticcio (dal punto di vista della leggibilità del codice e della facilità di comprensione)
Lo faccio bilingue perchè ho paura poi di finire in qualche scambio di metodi/variabili/classi inatteso, soprattutto ora che non sto capendo assolutamente niente ( no dai beh, poco ) di come si gestiscono le variabili..
__________________
Dell XPS 13 (9350) :: i5-2500K - HD6870 - AsRock Z68 Pro3 - Corsair Vengeance 8GB (4x2) DDR3 :: Samsung Galaxy S4 GT-i9505
kwb è offline   Rispondi citando il messaggio o parte di esso
Old 24-10-2012, 16:20   #14
banryu79
Senior Member
 
L'Avatar di banryu79
 
Iscritto dal: Oct 2007
Città: Padova
Messaggi: 4131
Quote:
Originariamente inviato da kwb Guarda i messaggi
Lo faccio bilingue perchè ho paura poi di finire in qualche scambio di metodi/variabili/classi inatteso
Questa non l'ho capita..
__________________

As long as you are basically literate in programming, you should be able to express any logical relationship you understand.
If you don’t understand a logical relationship, you can use the attempt to program it as a means to learn about it.
(Chris Crawford)
banryu79 è offline   Rispondi citando il messaggio o parte di esso
Old 24-10-2012, 16:24   #15
kwb
Senior Member
 
L'Avatar di kwb
 
Iscritto dal: Jul 2003
Città: Alessandria
Messaggi: 10167
Quote:
Originariamente inviato da banryu79 Guarda i messaggi
Questa non l'ho capita
Nel senso che poi magari mi confondo e invece di scrivere il nome della variabili, scrivo il nome della classe ( che magari si chiamano simili ).
__________________
Dell XPS 13 (9350) :: i5-2500K - HD6870 - AsRock Z68 Pro3 - Corsair Vengeance 8GB (4x2) DDR3 :: Samsung Galaxy S4 GT-i9505
kwb è offline   Rispondi citando il messaggio o parte di esso
Old 24-10-2012, 16:35   #16
banryu79
Senior Member
 
L'Avatar di banryu79
 
Iscritto dal: Oct 2007
Città: Padova
Messaggi: 4131
Quote:
Originariamente inviato da kwb Guarda i messaggi
Nel senso che poi magari mi confondo e invece di scrivere il nome della variabili, scrivo il nome della classe ( che magari si chiamano simili ).
Ma scusa, adotta una convenzione.
Tipo: i nomi delle classi iniziano in maiuscolo, i campi delle istanze in minuscolo.
Floor è la classe, floor il campo.
Closet è la classe, closet il campo, ecc...
Comunque nessuno ti vieta di fare qual cavolo che vuoi eh, il mio era solo un consiglio
__________________

As long as you are basically literate in programming, you should be able to express any logical relationship you understand.
If you don’t understand a logical relationship, you can use the attempt to program it as a means to learn about it.
(Chris Crawford)
banryu79 è offline   Rispondi citando il messaggio o parte di esso
Old 24-10-2012, 23:11   #17
kwb
Senior Member
 
L'Avatar di kwb
 
Iscritto dal: Jul 2003
Città: Alessandria
Messaggi: 10167
Ho seguito il tuo suggerimento e ho fatto così.
Ora però, alle prese con la creazione della biblioteca vuota ( senza libri ), mi da un errore, dentro il file Closet.py
Codice:
self._shelf[i].append(dummyS)
IndexError: list index out of range
I moduli
Main.py:
Codice:
from Floor import *
from Book import *
#Initialize the array
floor=[]

for i in range(2): #Use 2 floors
    tempFloor=Floor(i)
    floor.append(tempFloor)
Floor.py:
Codice:
from Closet import *

class Floor():
    floorNumber =0
    def __init__(self, n):
        self._closet=[]
        for i in range(5): #Create 5 closets
            dummyC=Closet(i)
            self._closet[i].append(dummyC)
        self.floorNumber=n
Closet.py:
Codice:
from Shelf import *
class Closet():
    
    closetNumber=0
    def __init__(self, closetNumber):
        self.closetNumber=closetNumber
        self._shelf=[]
        for i in range(5): #Create 5 shelves
            dummyS=Shelf(i)
            self._shelf[i].append(dummyS)
Shelf.py:
Codice:
class Shelf():
    
    shelfNumber=0
    book=[]
    def __init__(self, shelfNumber):
        self.shelfNumber=shelfNumber
Non capisco perchè gli indici i nei for, non aumentano...
Inoltre, è giusto come ho gestito le variabili?
__________________
Dell XPS 13 (9350) :: i5-2500K - HD6870 - AsRock Z68 Pro3 - Corsair Vengeance 8GB (4x2) DDR3 :: Samsung Galaxy S4 GT-i9505
kwb è offline   Rispondi citando il messaggio o parte di esso
Old 25-10-2012, 05:19   #18
cdimauro
Senior Member
 
L'Avatar di cdimauro
 
Iscritto dal: Jan 2002
Città: Germania
Messaggi: 26110
Ci sono diversi errori. Il primo è che hai dichiarato floorNumber, closetNumber, shelfNumber, e (soprattutto!) book come variabili di classe, quando è chiaro che dovrebbero essere d'istanza, per l'uso che ne fai. Quindi ti basta eliminare l'assegnazione a zero (e lista vuota per l'ultimo) che nei fai all'interno della definizione della classe.

Quello che ti crea problemi, comunque, è il fatto che accedi a un elemento della lista quando ancora non gliel'hai inserito con append. Infatti per popolare la lista al posto di questo:
Codice:
self._closet[i].append(dummyC)
devi scrivere:
Codice:
self._closet.append(dummyC)
Ciò vale anche per Closet.py.

Infatti tu hai creato una lista vuota con self._closet = [] , ma... devi ancora popolarla. E lo fai col metodo append, ma devi applicarlo a self._closet, perché è questa lista, mentre self._closet[i] non è una lista (potrebbe anche esserlo, eh!) ma un suo elementi, che nello specifico è un'istanza di Closet.

Un'ottimizzazione che potresti fare è quella di eliminare l'uso delle variabili temporanee. Un esempio:
Codice:
for i in range(2): #Use 2 floors
    floor.append(Floor(i))
Se sistemi tutto il codice in modo che sia in questa forma, puoi sfruttare un bellissimo strumento di Python che sono le list comprehension, che ti permettono di creare (e popolare) una lista in maniera compatta ed elegante:
Codice:
floor = [Floor(i) for i in range(2)] #Use 2 floors
Se hai un background matematico, ti dovrebbe essere facile leggerla e comprenderne il significato.
__________________
Per iniziare a programmare c'è solo Python con questo o quest'altro (più avanzato) libro
@LinkedIn Non parlo in alcun modo a nome dell'azienda per la quale lavoro
Ho poco tempo per frequentare il forum; eventualmente, contattatemi in PVT o nel mio sito. Fanboys

Ultima modifica di cdimauro : 25-10-2012 alle 05:22.
cdimauro è offline   Rispondi citando il messaggio o parte di esso
Old 25-10-2012, 11:32   #19
kwb
Senior Member
 
L'Avatar di kwb
 
Iscritto dal: Jul 2003
Città: Alessandria
Messaggi: 10167
Allora, non riesco ancora ad afferrare la differenza tra variabile di classe e d'istanza.
A livello di allocazione di memoria ed accesso alla variabile ( perchè credo che la differenza sia in quello ), cosa cambia?
Non sono riuscito a trovare qualcosa che lo spiegasse chiaramente, nemmeno il tutorial sul sito di python lo spiega...
Da quello che ho capito io la variabile di istanza esiste ( e lo spazio in memoria per essa viene allocato ) quando creo l'oggetto ( ovvero con un Floor(i) ad esempio ) e dura fino alla deallocazione in memoria dell'oggetto.
Ma la variabile di classe?

Quote:
Originariamente inviato da cdimauro Guarda i messaggi
Ci sono diversi errori. Il primo è che hai dichiarato floorNumber, closetNumber, shelfNumber, e (soprattutto!) book come variabili di classe, quando è chiaro che dovrebbero essere d'istanza, per l'uso che ne fai. Quindi ti basta eliminare l'assegnazione a zero (e lista vuota per l'ultimo) che nei fai all'interno della definizione della classe.
Per book=[] devo ancora vedere come gestirlo, ma penso tu abbia ragione, perchè deve essere creato dentro l'oggetto shelf.

Quote:
Originariamente inviato da cdimauro Guarda i messaggi
Quello che ti crea problemi, comunque, è il fatto che accedi a un elemento della lista quando ancora non gliel'hai inserito con append. Infatti per popolare la lista al posto di questo:
Codice:
self._closet[i].append(dummyC)
devi scrivere:
Codice:
self._closet.append(dummyC)
Ciò vale anche per Closet.py.

Infatti tu hai creato una lista vuota con self._closet = [] , ma... devi ancora popolarla. E lo fai col metodo append, ma devi applicarlo a self._closet, perché è questa lista, mentre self._closet[i] non è una lista (potrebbe anche esserlo, eh!) ma un suo elementi, che nello specifico è un'istanza di Closet.
Si è vero, è una svista. Mi confondono un casino ste liste...

Quote:
Originariamente inviato da cdimauro Guarda i messaggi
Un'ottimizzazione che potresti fare è quella di eliminare l'uso delle variabili temporanee. Un esempio:
Codice:
for i in range(2): #Use 2 floors
    floor.append(Floor(i))
Se sistemi tutto il codice in modo che sia in questa forma, puoi sfruttare un bellissimo strumento di Python che sono le list comprehension, che ti permettono di creare (e popolare) una lista in maniera compatta ed elegante:
Codice:
floor = [Floor(i) for i in range(2)] #Use 2 floors
Se hai un background matematico, ti dovrebbe essere facile leggerla e comprenderne il significato.
Mi sono guardato le list comprehension sul sito di python.
Mi pare di capire che essenzialmente ciò che vuoi far fare in seguito ad un condizione lo metti prima e dopo metti la/e condizione/i.
Poi la teoria è sempre diversa dalla pratica
__________________
Dell XPS 13 (9350) :: i5-2500K - HD6870 - AsRock Z68 Pro3 - Corsair Vengeance 8GB (4x2) DDR3 :: Samsung Galaxy S4 GT-i9505
kwb è offline   Rispondi citando il messaggio o parte di esso
Old 25-10-2012, 12:04   #20
kwb
Senior Member
 
L'Avatar di kwb
 
Iscritto dal: Jul 2003
Città: Alessandria
Messaggi: 10167
Ho aggiustato un po' e ora almeno stampa qualcosa.
Tuttavia, come faccio a creare lo spazio di memoria per l'oggetto book ( creare una lista lunga 10 book, dentro shelf ) senza però dover assegnare i valori ( perchè lo farò tramite il metodo addBook )?
__________________
Dell XPS 13 (9350) :: i5-2500K - HD6870 - AsRock Z68 Pro3 - Corsair Vengeance 8GB (4x2) DDR3 :: Samsung Galaxy S4 GT-i9505
kwb è offline   Rispondi citando il messaggio o parte di esso
 Rispondi


Reno16 Pro: il compatto di OPPO punta su fotocamera da 200MP e il nuovo Bubble! La recensione Reno16 Pro: il compatto di OPPO punta su fotocam...
 Hisense 55U7SE: tuttofare e accessibile, il MiniLED per film, sport e gioco Hisense 55U7SE: tuttofare e accessibile, il Min...
Kindle Scribe Colorsoft: riduce le cornici e diventa a colori, ma il prezzo è alto Kindle Scribe Colorsoft: riduce le cornici e div...
L'IA cambia tutte le regole della sicurezza tra vulnerabilità e sorveglianza. Intervista al CEO di Proofpoint L'IA cambia tutte le regole della sicurezza tra ...
L'Europa conta nella tecnologia e può essere autonoma. Cosa si è detto al Nextcloud Summit 2026 L'Europa conta nella tecnologia e può ess...
In Italia crescono gli investimenti nell...
Samsung combina IA e quantum computing p...
Anthropic ammette: Claude Code usa un ap...
L'IA costa sempre di più: AWS aum...
Google prepara il blocco delle app non v...
Amazfit aggiorna il Cheetah 2 Ultra: ric...
L'FAA apre ai voli commerciali supersoni...
Amazon ha già abbastanza satelliti per a...
A2A ed Equinix uniscono le forze per rec...
Apple ha creato la crisi delle memorie? ...
GPU subito in cambio di una quota dei ri...
Firefly Aerospace potrà lanciare ...
Intesa Sanpaolo sposta i sistemi IT core...
Visa, Mastercard e Coinbase lanciano Ope...
PS Plus Essential: nei giochi 'gratis' d...
Chromium
GPU-Z
OCCT
LibreOffice Portable
Opera One Portable
Opera One 106
CCleaner Portable
CCleaner Standard
Cpu-Z
Driver NVIDIA GeForce 546.65 WHQL
SmartFTP
Trillian
Google Chrome Portable
Google Chrome 120
VirtualBox
Tutti gli articoli Tutte le news Tutti i download

Strumenti

Regole
Non Puoi aprire nuove discussioni
Non Puoi rispondere ai messaggi
Non Puoi allegare file
Non Puoi modificare i tuoi messaggi

Il codice vB è On
Le Faccine sono On
Il codice [IMG] è On
Il codice HTML è Off
Vai al Forum


Tutti gli orari sono GMT +1. Ora sono le: 15:50.


Powered by vBulletin® Version 3.6.4
Copyright ©2000 - 2026, Jelsoft Enterprises Ltd.
Served by www3v