|
|||||||
|
|
|
![]() |
|
|
Strumenti |
|
|
#1 |
|
Senior Member
Iscritto dal: Nov 2002
Messaggi: 6868
|
[Python] Metodi bound/unbound
Ciao,
rieccomi con un dubbio di Python sui metodi bound/unbound: Supponiamo di avere il seguente codice: Codice:
Class Test(Object):
def metodo_uno(self):
print "Chiamato metodo_uno"
def metodo_due():
print "Chiamato metodo_due"
a_test = Test()
a_test.metodo_uno()
a_test.metodo_due()
Codice:
>>> a_test = Test() Chiamato metodo_uno >>> a_test.metodo_due() Traceback (most recent call last): File "<stdin>", line 1, in <module> TypeError: metodo_due() takes no arguments (1 given) Ora, il secondo metodo è dunque unbound, per il fatto che non ci sia il self come argomento. Ma quindi mettere self non è opzionale, ma fondamentale in quanto cambia completamente il comportamento. E' giusto? Come si richiama il secondo metodo? Ultima modifica di Unrue : 08-01-2010 alle 12:33. |
|
|
|
|
|
#2 |
|
Senior Member
Iscritto dal: Jan 2002
Città: Germania
Messaggi: 26110
|
No, il secondo metodo rimane sempre un metodo bound, a prescindere che tu abbia specificato o meno il primo argomento, perché è stato dichiarato all'interno di una classe.
Quindi, anche se lo ometti, quando provi a richiamarlo il compilatore ha comunque generato una chiamata a metodo_due passandogli come parametro l'istanza. Per ottenere un metodo "statico" devi ricorrere all'apposito decoratore: Codice:
Class Test(Object):
def metodo_uno(self):
print "Chiamato metodo_uno"
@staticmethod
def metodo_due():
print "Chiamato metodo_due"
a_test = Test()
a_test.metodo_uno()
a_test.metodo_due()
__________________
Per iniziare a programmare c'è solo Python con questo o quest'altro (più avanzato) libro @LinkedIn Non parlo in alcun modo a nome dell'azienda per la quale lavoro Ho poco tempo per frequentare il forum; eventualmente, contattatemi in PVT o nel mio sito. Fanboys |
|
|
|
|
|
#3 | |
|
Senior Member
Iscritto dal: Nov 2002
Messaggi: 6868
|
Quote:
quindi la differenza tra metodo bound e unbound è che quello bound è dichiarato all'interno della classe, quello unbound all'esterno? Ma allora quando devo mettere come argomento self e quando no? Ultima modifica di Unrue : 08-01-2010 alle 14:24. |
|
|
|
|
|
|
#4 | ||
|
Senior Member
Iscritto dal: Jan 2002
Città: Germania
Messaggi: 26110
|
Quote:
La differenza fra funzione e metodo sta nel fatto che il secondo viene dichiarato all'interno di una classe, e in questo caso pretende sempre come primo parametro un'istanza della stessa classe (a meno di usare i due decoratori di cui ti parlavo). Un metodo poi può essere bound o unbound, a seconda se è legato a una precisa istanza oppure no. Quindi Codice:
Class Test(Object):
def metodo_uno(self):
print "Chiamato metodo_uno"
def metodo_due():
print "Chiamato metodo_due"
a_test = Test()
b_test = Test()
bound = a_test.metodo_uno
unbound = Test.metodo_due
bound()
unbuond(a_test)
unbuond(b_test)
Quote:
Sempre dentro una classe, lo puoi omettere se utilizzi @staticmethod (in questo modo il metodo diventa un metodo statico, cioé una funzione).
__________________
Per iniziare a programmare c'è solo Python con questo o quest'altro (più avanzato) libro @LinkedIn Non parlo in alcun modo a nome dell'azienda per la quale lavoro Ho poco tempo per frequentare il forum; eventualmente, contattatemi in PVT o nel mio sito. Fanboys |
||
|
|
|
|
|
#5 | |
|
Senior Member
Iscritto dal: Nov 2002
Messaggi: 6868
|
Mm,
il tuo esempio dà errore: Codice:
class Test():
def metodo_uno(self):
print "Called method_one"
def metodo_due():
print "Called method_two"
a_test = Test()
b_test = Test()
bound = a_test.metodo_uno
unbound = Test.metodo_due
bound()
unbound(a_test)
unbound(b_test)
Codice:
Called method_one
Traceback (most recent call last):
File "bound.py", line 17, in <module>
unbound(a_test)
TypeError: metodo_due() takes no arguments (1 given)
Quote:
Ultima modifica di Unrue : 08-01-2010 alle 14:56. |
|
|
|
|
|
|
#6 | |||
|
Senior Member
Iscritto dal: Jan 2002
Città: Germania
Messaggi: 26110
|
Quote:
Quote:
Il secondo può non accettarla, perché è un funzione come un'altra. Quote:
__________________
Per iniziare a programmare c'è solo Python con questo o quest'altro (più avanzato) libro @LinkedIn Non parlo in alcun modo a nome dell'azienda per la quale lavoro Ho poco tempo per frequentare il forum; eventualmente, contattatemi in PVT o nel mio sito. Fanboys Ultima modifica di cdimauro : 08-01-2010 alle 15:02. Motivo: Corretta minchiata su metodi unbound vs statici |
|||
|
|
|
|
|
#7 |
|
Senior Member
Iscritto dal: Nov 2002
Messaggi: 6868
|
Ok capito!
Grazie come sempre, ciao |
|
|
|
|
|
#8 | |
|
Senior Member
Iscritto dal: Nov 2002
Messaggi: 6868
|
Quote:
Dunque, se un metodo unbound non è legato ad una particolare istanza, perché vuole un'istanza come primo argomento? Infine, questo è un esempio di metodo statico: Codice:
class prova():
@staticmethod
def pippo():
pass
|
|
|
|
|
|
|
#9 | ||
|
Senior Member
Iscritto dal: Jan 2002
Città: Germania
Messaggi: 26110
|
Quote:
Un metodo bound è un metodo in cui l'oggetto è già legato a una particolare istanza, per cui non c'è bisogno di (e NON si deve) specificare nessuna istanza: al più si passano eventuali parametri, ed è già in grado di lavorare. Un metodo unbound vedilo come una "promessa di matrimonio", dove un partner aspetta l'altro per poter "convolare a nozze". Tale metodo (uno dei partner) è legato a una precisa classe, ma aspetta la sua "amata" istanza (l'altro partner) per poter effettuare il lavoro vero e proprio. Rispetto al metodo bound, però, è un po' più "libertino", perché quello bound è legato alla sua istanza "finché morte (cioè il garbage collector) non li separa", mentre quello unbound si può utilizzare con qualunque istanza della stessa classe che gli viene passata. Quote:
Codice:
class prova():
def pippo():
pass
unbound = prova.pippo
istanza1 = prova()
istanza2 = prova()
unbound(istanza1)
unbound(istanza2)
P.S. Scusami per prima, ma avevo fretta, e ho commesso un errore da dilettante.
__________________
Per iniziare a programmare c'è solo Python con questo o quest'altro (più avanzato) libro @LinkedIn Non parlo in alcun modo a nome dell'azienda per la quale lavoro Ho poco tempo per frequentare il forum; eventualmente, contattatemi in PVT o nel mio sito. Fanboys |
||
|
|
|
|
|
#10 | ||
|
Senior Member
Iscritto dal: Nov 2002
Messaggi: 6868
|
Quote:
Quote:
|
||
|
|
|
|
| Strumenti | |
|
|
Tutti gli orari sono GMT +1. Ora sono le: 05:37.




















