Torna indietro   Hardware Upgrade Forum > Software > Programmazione

Sony INZONE H6 Air: il primo headset open-back di Sony per giocatori
Sony INZONE H6 Air: il primo headset open-back di Sony per giocatori
Il primo headset open-back della linea INZONE arriva a 200 euro con driver derivati dalle cuffie da studio MDR-MV1 e un peso record di soli 199 grammi
Nutanix cambia pelle: dall’iperconvergenza alla piattaforma full stack per cloud ibrido e IA
Nutanix cambia pelle: dall’iperconvergenza alla piattaforma full stack per cloud ibrido e IA
Al .NEXT 2026 di Chicago, Nutanix ha mostrato quanto sia cambiata: una piattaforma software che gestisce VM, container e carichi di lavoro IA ovunque, dall’on-premise al cloud pubblico. Con un’esecuzione rapidissima sulle partnership e sulla migrazione da VMware
Recensione Xiaomi Pad 8 Pro: potenza bruta e HyperOS 3 per sfidare la fascia alta
Recensione Xiaomi Pad 8 Pro: potenza bruta e HyperOS 3 per sfidare la fascia alta
Xiaomi Pad 8 Pro adotta il potente Snapdragon 8 Elite all'interno di un corpo con spessore di soli 5,75 mm e pannello LCD a 144Hz flicker-free, per un tablet che può essere utilizzato con accessori dedicati di altissima qualità. Fra le caratteristiche esclusive, soprattutto per chi intende usarlo con la tastiera ufficiale, c'è la modalità Workstation di HyperOS 3, che trasforma Android in un sistema operativo con interfaccia a finestre
Tutti gli articoli Tutte le news

Vai al Forum
Rispondi
 
Strumenti
Old 08-01-2010, 12:17   #1
Unrue
Senior Member
 
L'Avatar di Unrue
 
Iscritto dal: Nov 2002
Messaggi: 6869
[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()
Ottengo il seguente errore:

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? E a cosa mi serve un metodo unbound? E' come un metodo statico?

Ultima modifica di Unrue : 08-01-2010 alle 12:33.
Unrue è offline   Rispondi citando il messaggio o parte di esso
Old 08-01-2010, 13:35   #2
cdimauro
Senior Member
 
L'Avatar di cdimauro
 
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()
C'è anche un decoratore (@classmethod) per i metodi di classe, che richiedono sempre un parametro, ma questo è la classe e non l'istanza dell'oggetto.
__________________
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
cdimauro è offline   Rispondi citando il messaggio o parte di esso
Old 08-01-2010, 14:07   #3
Unrue
Senior Member
 
L'Avatar di Unrue
 
Iscritto dal: Nov 2002
Messaggi: 6869
Quote:
Originariamente inviato da cdimauro Guarda i messaggi
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.
Ciao,
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? Cioè, continuo a non capire perché il primo metodo lo accetta ed il secondo no.

Ultima modifica di Unrue : 08-01-2010 alle 14:24.
Unrue è offline   Rispondi citando il messaggio o parte di esso
Old 08-01-2010, 14:38   #4
cdimauro
Senior Member
 
L'Avatar di cdimauro
 
Iscritto dal: Jan 2002
Città: Germania
Messaggi: 26110
Quote:
Originariamente inviato da Unrue Guarda i messaggi
Ciao,
quindi la differenza tra metodo bound e unbound è che quello bound è dichiarato all'interno della classe, quello unbound all'esterno?
Attenzione: c'è differenza fra funzione e metodo, e fra metodo bound e metodo unbuond.

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:
Ma allora quando devo mettere come argomento self e quando no? Cioè, continuo a non capire perché il primo metodo lo accetta ed il secondo no.
Self lo devi mettere SEMPRE quando dichiari una funzione in una classe (quindi hai dichiarato un metodo).

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
cdimauro è offline   Rispondi citando il messaggio o parte di esso
Old 08-01-2010, 14:53   #5
Unrue
Senior Member
 
L'Avatar di Unrue
 
Iscritto dal: Nov 2002
Messaggi: 6869
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)
Cioè, in pratica, quale è la differenza tra metodo unbound e metodo "statico"?

Quote:
Originariamente inviato da cdimauro
Self lo devi mettere SEMPRE quando dichiari una funzione in una classe (quindi hai dichiarato un metodo).

Sempre dentro una classe, lo puoi omettere se utilizzi @staticmethod (in questo modo il metodo diventa un metodo statico, cioé una funzione).
Quindi scrivere un metodo senza decoratore @staticmethod e senza self come argomento è un errore giusto?

Ultima modifica di Unrue : 08-01-2010 alle 14:56.
Unrue è offline   Rispondi citando il messaggio o parte di esso
Old 08-01-2010, 15:00   #6
cdimauro
Senior Member
 
L'Avatar di cdimauro
 
Iscritto dal: Jan 2002
Città: Germania
Messaggi: 26110
Quote:
Originariamente inviato da Unrue Guarda i messaggi
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)
Sbadatamente ho ricopiato il tuo codice col metodo senza il parametro self. Aggiungilo e funzionerà.
Quote:
Cioè, in pratica, quale è la differenza tra metodo unbound e metodo "statico"?
Il primo pretende un'istanza come primo argomento, nel momento dell'invocazione.

Il secondo può non accettarla, perché è un funzione come un'altra.
Quote:
Quindi scrivere un metodo senza decoratore @staticmethod e senza self come argomento è un errore giusto?
Sì, lo è, perché non puoi richiamarlo.
__________________
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
cdimauro è offline   Rispondi citando il messaggio o parte di esso
Old 08-01-2010, 15:02   #7
Unrue
Senior Member
 
L'Avatar di Unrue
 
Iscritto dal: Nov 2002
Messaggi: 6869
Ok capito!
Grazie come sempre, ciao
Unrue è offline   Rispondi citando il messaggio o parte di esso
Old 08-01-2010, 15:24   #8
Unrue
Senior Member
 
L'Avatar di Unrue
 
Iscritto dal: Nov 2002
Messaggi: 6869
Quote:
Originariamente inviato da cdimauro Guarda i messaggi

Il primo pretende un'istanza come primo argomento, nel momento dell'invocazione.

Il secondo può non accettarla, perché è un funzione come un'altra.
Noo, aspetta! Non avevo letto la tua ultima modifica...

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
Un metodo unbound invece come si scrive?
Unrue è offline   Rispondi citando il messaggio o parte di esso
Old 08-01-2010, 19:51   #9
cdimauro
Senior Member
 
L'Avatar di cdimauro
 
Iscritto dal: Jan 2002
Città: Germania
Messaggi: 26110
Quote:
Originariamente inviato da Unrue Guarda i messaggi
Noo, aspetta! Non avevo letto la tua ultima modifica...

Dunque, se un metodo unbound non è legato ad una particolare istanza, perché vuole un'istanza come primo argomento?
Perché rimane comunque un metodo, e i metodi lavorano esclusivamente su / con delle istanze.

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:
Infine, questo è un esempio di metodo statico:

Codice:
class prova():
  @staticmethod
   def pippo():
     pass
Un metodo unbound invece come si scrive?
Così:
Codice:
class prova():
   def pippo():
     pass

unbound = prova.pippo

istanza1 = prova()
istanza2 = prova()

unbound(istanza1)
unbound(istanza2)
In buona sostanza, "unbound" è semplicemente il riferimento al metodo pippo della classe prova.

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
cdimauro è offline   Rispondi citando il messaggio o parte di esso
Old 09-01-2010, 10:01   #10
Unrue
Senior Member
 
L'Avatar di Unrue
 
Iscritto dal: Nov 2002
Messaggi: 6869
Quote:
Originariamente inviato da cdimauro Guarda i messaggi
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.
Credo di aver capito

Quote:
Originariamente inviato da cdimauro Guarda i messaggi
P.S. Scusami per prima, ma avevo fretta, e ho commesso un errore da dilettante.
Di nulla . Grazie infinite, ciao!
Unrue è offline   Rispondi citando il messaggio o parte di esso
 Rispondi


Sony INZONE H6 Air: il primo headset open-back di Sony per giocatori Sony INZONE H6 Air: il primo headset open-back d...
Nutanix cambia pelle: dall’iperconvergenza alla piattaforma full stack per cloud ibrido e IA Nutanix cambia pelle: dall’iperconvergenza alla ...
Recensione Xiaomi Pad 8 Pro: potenza bruta e HyperOS 3 per sfidare la fascia alta Recensione Xiaomi Pad 8 Pro: potenza bruta e Hyp...
NZXT H9 Flow RGB+, Kraken Elite 420 e F140X: abbiamo provato il tris d'assi di NZXT NZXT H9 Flow RGB+, Kraken Elite 420 e F140X: abb...
ASUS ROG Swift OLED PG34WCDN recensione: il primo QD-OLED RGB da 360 Hz ASUS ROG Swift OLED PG34WCDN recensione: il prim...
Ecovacs presenta la gamma 2026: paviment...
Efficienza energetica fino a 2.000 volte...
Lenovo 360: il programma di canale dell'...
Appena 10.000 qubit per rompere la critt...
Analisi dei transistor durante il funzio...
Attacco informatico a Booking.com: espos...
A quattro mesi dal divieto dei social ne...
NVIDIA GeForce RTX 5060 e 5060 Ti: in ar...
Rebellions, Arm e SK Telecom, nuova alle...
Modernizzazione delle app: Red Hat OpenS...
Nel mirino di Google c'è il back ...
PRAGMATA in bundle con GeForce RTX 5000:...
Le novità MOVA per il 2026: robot e impi...
Windows, stop all'attivazione telefonica...
ASUS porta la serie TUF nel formato Mini...
Chromium
GPU-Z
OCCT
LibreOffice Portable
Opera One Portable
Opera One 106
CCleaner Portable
CCleaner Standard
Cpu-Z
Driver NVIDIA GeForce 546.65 WHQL
SmartFTP
Trillian
Google Chrome Portable
Google Chrome 120
VirtualBox
Tutti gli articoli Tutte le news Tutti i download

Strumenti

Regole
Non Puoi aprire nuove discussioni
Non Puoi rispondere ai messaggi
Non Puoi allegare file
Non Puoi modificare i tuoi messaggi

Il codice vB è On
Le Faccine sono On
Il codice [IMG] è On
Il codice HTML è Off
Vai al Forum


Tutti gli orari sono GMT +1. Ora sono le: 21:25.


Powered by vBulletin® Version 3.6.4
Copyright ©2000 - 2026, Jelsoft Enterprises Ltd.
Served by www3v