Re: [Python] Semplice domanda sulle classi.
Il 09/01/2014 12:51, Gabriele Battaglia ha scritto: GB: Ciao e grazie per la tua preziosa mail, ricca di commenti a margine che danno spunti tutt'altro che marginali. Non so a che manuale tu ti stia riferendo, quelli presenti fra la documentazione di www.python.it li ho praticamente scorsi tutti, più qualche altro libro in inglese e quelli di Marco beri... Ma non importa sapere quale sia, il concetto mi è chiaro, ho capito l'importanza di avere un metodo di inizializzazione, mentre ancora mi sfugge il vantaggio di ereditare da object, questo però, a causa della mia conoscenza insufficiente di Python, imparerò via via che apprendo. Buona lettura ;) http://www.python-it.org/contenuti/10/06/22/un-nuovo-stile-per-le-classi ___ Python mailing list Python@lists.python.it http://lists.python.it/mailman/listinfo/python
Re: [Python] Semplice domanda sulle classi.
From: "enrico franchi" 2014/1/5 Raffaele Salmaso class Veicoli: > ruote = 4 > > Auto = Veicoli() > Auto.ruote = 5 class Veicoli(object): def __init__(self, ruote=4): self._ruote = ruote Giusto visto che nessuno lo ha menzionato in modo esteso e vale definitivamente una precisazione. Siccome c'e' un noto manuale (che dovrebbe venire *deprecato* brutalmente) che introduce le cose come le stai facendo, mi viene il sospetto che tu lo stia seguendo (e te lo sconsiglio vivamente). GB: Ciao e grazie per la tua preziosa mail, ricca di commenti a margine che danno spunti tutt'altro che marginali. Non so a che manuale tu ti stia riferendo, quelli presenti fra la documentazione di www.python.it li ho praticamente scorsi tutti, più qualche altro libro in inglese e quelli di Marco beri... Ma non importa sapere quale sia, il concetto mi è chiaro, ho capito l'importanza di avere un metodo di inizializzazione, mentre ancora mi sfugge il vantaggio di ereditare da object, questo però, a causa della mia conoscenza insufficiente di Python, imparerò via via che apprendo. Dimentichiamo la tua definizione di classe. Sul manuale maledetto, *prima* ti fa vedere qualcosa tipo (nb, siccome quella classe rappresenta *un* veicolo e non una collezione di veicoli, tanto vale chiamarlo veicolo): GB: A mia parziale discolpa posso dire che ho scritto in fretta, soloper chiarire il concetto di properties. In uno script serio, l'avrei forse fatta meglio... :) col suo bravo __init__(self): Per sottintendere che capisco il concetto di classe come fabbrica di oggetti, l'avevo chiamata Veicoli, al plurare, mentre Auto, era l'oggetto appartenente alla classe veicoli, il che è corretto anche da un punto di vista logico e semantico. Bene, grazie ancora, ho letto con interesse tutto ciò che mi hai consigliato e ne farò tesoro. GB. ___ Python mailing list Python@lists.python.it http://lists.python.it/mailman/listinfo/python
Re: [Python] Semplice domanda sulle classi.
2014/1/5 Raffaele Salmaso > class Veicoli: > > ruote = 4 > > > > Auto = Veicoli() > > Auto.ruote = 5 > > class Veicoli(object): > def __init__(self, ruote=4): > self._ruote = ruote Giusto visto che nessuno lo ha menzionato in modo esteso e vale definitivamente una precisazione. Siccome c'e' un noto manuale (che dovrebbe venire *deprecato* brutalmente) che introduce le cose come le stai facendo, mi viene il sospetto che tu lo stia seguendo (e te lo sconsiglio vivamente). Queste cose qua sopra *non* sono parenti. Il modo corretto e' quello che ti fa veder Raffaele. Dimentichiamo la tua definizione di classe. Sul manuale maledetto, *prima* ti fa vedere qualcosa tipo (nb, siccome quella classe rappresenta *un* veicolo e non una collezione di veicoli, tanto vale chiamarlo veicolo): class Veicolo: pass auto = Veicolo() auto.ruote = 4 Ecco, questo *non* e' come si lavora normalmente in Python (ne e' buona programmazione ad oggetti). Ovvero e' veramente brutto usare come pratica normale quella di instanziare oggetti grosso modo vuoti e poi appiccicare gli attributi fuori. Questo e' il mestiere del costruttore. Ovvero si fa come suggerisce Raffaele. class Veicolo(object): def __init__(self, ruote=4): self.ruote = ruote Fine della fiera. Note a margine... Raffaele usa un valore di default per il parametro del costruttore. Quando la cosa ha senso, e' conveniente farlo. Non e' obbligatorio. Seconda nota a margine: eredita da object. Se usi Python 2, *fallo*. Spiegarti perche' prende un po' troppo spazio, se ne e' parlato altre volte in lista e un manuale moderno e decente te lo chiarisce ampiamente. Quindi: a. class Veicolo(object): # -> buono b. class Veicolo: # -> cattivo Quando scrivi class Veicoli: ruote = 4 fai una cosa che e' chiaramente *non* quello che vuoi fare. Ovvero assegni l'attributo alla classe e non all'istanza (la differenza e' rilevantissima ed e' bene che sia chiara). In particolare, appena ti trovi ad avere come attributo un oggetto mutabile (e.g., una lista, un dizionario, un normale oggetto python) ti troverai con una profusione di bachi apparentemente inspiegabili. Note ancora piu' a margine... normalmente in Python le variabili sono minuscole, le classi sono Maiuscole, le costanti sono TUTTE_MAIUSCOLE. E' una convenzione piuttosto rispettata e semplifica la lettura del codice. Per discutere sull'opportunita' di controllare il numero di ruote tramite una property, sono ormai fuori dal foglio. ;) -- . ..: -enrico- ___ Python mailing list Python@lists.python.it http://lists.python.it/mailman/listinfo/python
Re: [Python] Semplice domanda sulle classi.
Grazie a tutti! Meravigliosi, come sempre. GB. ___ Python mailing list Python@lists.python.it http://lists.python.it/mailman/listinfo/python
Re: [Python] Semplice domanda sulle classi.
> > P.S. Per Gabriele: si tratta di una macchina agricola a 5 ruote. > Nossignore, trattasi della notissima legge i Ohm: ogni quattro Ohm una Ohm di scorta (in dialetto abruzzese rende meglio) Carlos -- "Somos los que amasan, sin embargo no tenemos pan, somos los que cavan el carbón, sin embargo tenemos frío somos los que no tienen nada, y estamos viniendo a tomar el mundo." Tassos Livaditis (Poeta greco, 1922, 1988) ___ Python mailing list Python@lists.python.it http://lists.python.it/mailman/listinfo/python
Re: [Python] Semplice domanda sulle classi.
2014/1/5 Raffaele Salmaso > if ruote not in (4,6, 8): > raise ValueError('no') > Gravissimo errore! :-) http://www.poettinger.at/img/landtechnik/schwadkreisel/fahrwerk722.jpg Ciao. Marco. P.S. Per Gabriele: si tratta di una macchina agricola a 5 ruote. ___ Python mailing list Python@lists.python.it http://lists.python.it/mailman/listinfo/python
Re: [Python] Semplice domanda sulle classi.
2014/1/5 Gabriele Battaglia : > Ciao. > Ho questo quesito, da principiante, sulle classi. > > Creo la mia fabbrica di automobili: > > class Veicoli: > ruote = 4 > > Per ora mi accontento e mi compro subito una macchina: > > Auto = Veicoli() > > Ora, siccome sono un tipo innovativo, mi metto li ed applico una modifica > alla mia vettura nuova: > > Auto.ruote = 5 > > Domanda: posso inserire del codice, nella classe, che forzi i dati membri ad > assumere solo determinati valori, e non altri? > Ad esempio, in questo caso, Auto.ruote potrebbe sollevare una eccezione o > essere aggiustato via codice ad un altro valore. @property (ah, hai cambiato solo la classe, ma il codice che la usa non serve cambiarlo ;) ) class Veicoli(object): def __init__(self, ruote=4): self._ruote = ruote @property def ruote(self): return self._route @ruote.setter def ruote(self, ruote): if ruote not in (4,6, 8): raise ValueError('no') self._ruote = ruote Auto = Veicoli() Auto.ruote = 5 -- | Raffaele Salmaso | http://salmaso.org | https://bitbucket.org/rsalmaso | http://gnammo.com ___ Python mailing list Python@lists.python.it http://lists.python.it/mailman/listinfo/python
Re: [Python] Semplice domanda sulle classi.
On 05/01/2014 00:22, Gabriele Battaglia wrote: Ciao. Ho questo quesito, da principiante, sulle classi. Creo la mia fabbrica di automobili: class Veicoli: ruote = 4 Per ora mi accontento e mi compro subito una macchina: Auto = Veicoli() Ora, siccome sono un tipo innovativo, mi metto li ed applico una modifica alla mia vettura nuova: Auto.ruote = 5 Domanda: posso inserire del codice, nella classe, che forzi i dati membri ad assumere solo determinati valori, e non altri? Ad esempio, in questo caso, Auto.ruote potrebbe sollevare una eccezione o essere aggiustato via codice ad un altro valore. Grazie. La strada e' quella di sovrascrivere il comportamento di default dell'assegnamento per l'attributo specifico. Cioe' devi scrivere una metodo che viene richiamato ogni volta che viene assegnato un valore all'attributo specifico. http://docs.python.org/2/library/functions.html#property ___ Python mailing list Python@lists.python.it http://lists.python.it/mailman/listinfo/python