<br><br><div class="gmail_quote">On Jan 22, 2008 5:22 PM, fde &lt;<a href="mailto:filiderba@email.it">filiderba@email.it</a>&gt; wrote:<br><blockquote class="gmail_quote" style="border-left: 1px solid rgb(204, 204, 204); margin: 0pt 0pt 0pt 0.8ex; padding-left: 1ex;">
Ciao,<br>non ho ancora ben chiaro come funzionano le classi.<br>Vi spiego il problema:<br>sto scrivendo una gui con wx, ho una finestra topwindow con delle<br>finestre figlie (wx.frame), fra queste voglio prenderne una e farne
<br>derivare un&#39;altra perchè la finestra è identica ma ha una funzione<br>differente... (la prima aggiunge la secodna modifica un dato).<br>Quindi ho fatto:<br>class frameB(frameA):<br> &nbsp; &nbsp; &nbsp; &nbsp;blah=ciao<br> &nbsp; &nbsp; &nbsp; &nbsp;self.textCtrlPinco.SetValue
(&quot;blah&quot;)<br><br>ma non funziona perchè non mi trova l&#39;oggetto self.textCtrlPinco che in<br>teoria dovrebbe aver ereditato da frameA..perchè ?<br>qualche aiuto ?<br><br></blockquote></div><br>Ciao<br>Quando chiami un metodo di un&#39;istanza di una classe, l&#39;istanza stessa viene passata come primo argomento della chiamata e il nome self&nbsp; nei parametri della funzione gli viene quindi associato. Questo nome è convenzionale (anche se è una forte convenzione). Avresti potuto chiamarlo anche s, foo, quello che vuoi.
<br>Esempio:<br>class Prova(object):<br>&nbsp;&nbsp;&nbsp; def __init__(nome_a_scelta):<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; nome_a_scelta.valore = 1<br><br>p = Prova()<br>print p.valore<br><br>Ne segue che non puoi riferirti a self.qualcosa se non sei all&#39;interno di un bound method il cui primo&nbsp; parametro sia chiamato self!
<br><br>Semplificando un po&#39; la chiamata a un metodo di un&#39;istanza puoi pensarla cosi&#39;:<br><br>NomeDellaClasse.metodo(Istanza, argomenti della chiamata)<br><br>per questo motivo se scrivi<br>class Prova(object):
<br>&nbsp;&nbsp; def __init__():<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; pass<br><br>(senza self)<br>fare p = Prova() ti darà un errore caratteristico:<br><br>Traceback (most recent call last):<br>&nbsp; File &quot;&lt;input&gt;&quot;, line 1, in &lt;module&gt;<br>TypeError: __init__() takes no arguments (1 given)
<br><br>Quale argomento hai passato in Prova()? risposta: hai passato l&#39;istanza stessa :-)<br><br>Quindi nel tuo caso, quando subclassi devi fare qualcosa del genere:<br><br>class A(object):<br>&nbsp;&nbsp;&nbsp; def __init__(self):
<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; # un po&#39; di inizializzazioni<br><br>class B(A):<br>&nbsp;&nbsp; def __init__(self):<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; A.__init__(self)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; # un altro po&#39; di inizializzazioni. E qui dentro puoi riferirti a self, che è il nome dell&#39;istanza nello scope di un bound method.
<br><br>Spero di averti chiarito un po&#39; le idee. Non ho sottomano Python in a nutshell dove queste cose sono scritte molto meglio, ma su internet troverai moltissime spiegazioni di questo meccanismo. Se hai altri dubbi, chiedi pure.
<br><br>ciao,<br>Francesco<br>