<br><br><div class="gmail_quote">On Jan 22, 2008 5:22 PM, fde <<a href="mailto:filiderba@email.it">filiderba@email.it</a>> 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'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> blah=ciao<br> self.textCtrlPinco.SetValue
("blah")<br><br>ma non funziona perchè non mi trova l'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'istanza di una classe, l'istanza stessa viene passata come primo argomento della chiamata e il nome self 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> def __init__(nome_a_scelta):<br> 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'interno di un bound method il cui primo parametro sia chiamato self!
<br><br>Semplificando un po' la chiamata a un metodo di un'istanza puoi pensarla cosi':<br><br>NomeDellaClasse.metodo(Istanza, argomenti della chiamata)<br><br>per questo motivo se scrivi<br>class Prova(object):
<br> def __init__():<br> pass<br><br>(senza self)<br>fare p = Prova() ti darà un errore caratteristico:<br><br>Traceback (most recent call last):<br> File "<input>", line 1, in <module><br>TypeError: __init__() takes no arguments (1 given)
<br><br>Quale argomento hai passato in Prova()? risposta: hai passato l'istanza stessa :-)<br><br>Quindi nel tuo caso, quando subclassi devi fare qualcosa del genere:<br><br>class A(object):<br> def __init__(self):
<br> # un po' di inizializzazioni<br><br>class B(A):<br> def __init__(self):<br> A.__init__(self)<br> # un altro po' di inizializzazioni. E qui dentro puoi riferirti a self, che è il nome dell'istanza nello scope di un bound method.
<br><br>Spero di averti chiarito un po' 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>