[Python] Semplice domanda sulle classi.

enrico franchi enrico.franchi a gmail.com
Mer 8 Gen 2014 15:20:41 CET


2014/1/5 Raffaele Salmaso <raffaele a salmaso.org>


> 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-
-------------- parte successiva --------------
Un allegato HTML è stato rimosso...
URL: <http://lists.python.it/pipermail/python/attachments/20140108/a737a847/attachment.html>


Maggiori informazioni sulla lista Python