[Python] derivare una classe

Francesco Guerrieri f.guerrieri a gmail.com
Mar 22 Gen 2008 19:30:56 CET


On Jan 22, 2008 5:22 PM, fde <filiderba a email.it> wrote:

> Ciao,
> non ho ancora ben chiaro come funzionano le classi.
> Vi spiego il problema:
> sto scrivendo una gui con wx, ho una finestra topwindow con delle
> finestre figlie (wx.frame), fra queste voglio prenderne una e farne
> derivare un'altra perchè la finestra è identica ma ha una funzione
> differente... (la prima aggiunge la secodna modifica un dato).
> Quindi ho fatto:
> class frameB(frameA):
>        blah=ciao
>        self.textCtrlPinco.SetValue("blah")
>
> ma non funziona perchè non mi trova l'oggetto self.textCtrlPinco che in
> teoria dovrebbe aver ereditato da frameA..perchè ?
> qualche aiuto ?
>
>
Ciao
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.
Esempio:
class Prova(object):
    def __init__(nome_a_scelta):
        nome_a_scelta.valore = 1

p = Prova()
print p.valore

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!

Semplificando un po' la chiamata a un metodo di un'istanza puoi pensarla
cosi':

NomeDellaClasse.metodo(Istanza, argomenti della chiamata)

per questo motivo se scrivi
class Prova(object):
   def __init__():
       pass

(senza self)
fare p = Prova() ti darà un errore caratteristico:

Traceback (most recent call last):
  File "<input>", line 1, in <module>
TypeError: __init__() takes no arguments (1 given)

Quale argomento hai passato in Prova()? risposta: hai passato l'istanza
stessa :-)

Quindi nel tuo caso, quando subclassi devi fare qualcosa del genere:

class A(object):
    def __init__(self):
      # un po' di inizializzazioni

class B(A):
   def __init__(self):
      A.__init__(self)
      # un altro po' di inizializzazioni. E qui dentro puoi riferirti a
self, che è il nome dell'istanza nello scope di un bound method.

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.

ciao,
Francesco
-------------- parte successiva --------------
Un allegato HTML è stato rimosso...
URL: http://lists.python.it/pipermail/python/attachments/20080122/f0fc5f82/attachment.htm 


More information about the Python mailing list