<div dir="ltr"><div class="gmail_extra"><br><div class="gmail_quote">2014/1/5 Raffaele Salmaso <span dir="ltr"><<a href="mailto:raffaele@salmaso.org" target="_blank">raffaele@salmaso.org</a>></span></div><div class="gmail_quote">
<br></div><div class="gmail_quote"><br><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left-width:1px;border-left-color:rgb(204,204,204);border-left-style:solid;padding-left:1ex"><div class="im">> class Veicoli:<br>
> ruote = 4<br>><br>
> Auto = Veicoli()<br>
> Auto.ruote = 5<br></div></blockquote><div> </div><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left-width:1px;border-left-color:rgb(204,204,204);border-left-style:solid;padding-left:1ex"><div class="im">
</div>
class Veicoli(object):<br>
def __init__(self, ruote=4):<br>
self._ruote = ruote</blockquote></div><br>Giusto visto che nessuno lo ha menzionato in modo esteso e vale definitivamente una precisazione.<br>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).<br>
<br clear="all"><div>Queste cose qua sopra *non* sono parenti. Il modo corretto e' quello che ti fa veder Raffaele.</div><div><br></div><div>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):</div>
<div><br></div><div>class Veicolo:</div><div> pass</div><div><br></div><div>auto = Veicolo()</div><div>auto.ruote = 4</div><div><br></div><div>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.</div>
<div><br></div><div>class Veicolo(object):<br> def __init__(self, ruote=4):<br> self.ruote = ruote<br></div><div><br></div><div>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.</div>
<div><br></div><div>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. </div>
<div><br></div><div>Quindi:</div><div><br></div><div>a. class Veicolo(object): # -> buono</div><div>b. class Veicolo: # -> cattivo<br></div><div><br></div><div>Quando scrivi </div><div><br></div><div><span style="color:rgb(80,0,80)">class Veicoli:</span></div>
<div><span style="color:rgb(80,0,80)"> ruote = 4</span><br></div><div><span style="color:rgb(80,0,80)"><br></span></div><div><span style="color:rgb(80,0,80)">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.</span></div>
<div><span style="color:rgb(80,0,80)"><br></span></div><div><span style="color:rgb(80,0,80)">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. </span></div>
<div><span style="color:rgb(80,0,80)"><br></span></div><div><span style="color:rgb(80,0,80)">Per discutere sull'opportunita' di controllare il numero di ruote tramite una property, sono ormai fuori dal foglio. ;)</span></div>
<div><span style="color:rgb(80,0,80)"><br></span></div><div><span style="color:rgb(80,0,80)"><br></span></div>-- <br> .<br>..: -enrico-
</div></div>