Torna indietro   Hardware Upgrade Forum > Software > Programmazione

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: abbiamo provato il tris d'assi di NZXT
Nelle ultime settimane abbiamo provato tre delle proposte top di gamma di NZXT nelle categorie case, dissipatori e ventole. Rispettivamente, parliamo dell'H9 Flow RGB+, Kraken Elite 420 e F140X. Si tratta, chiaramente, di prodotti di fascia alta che si rivolgono agli utenti DIY che desiderano il massimo per la propria build. Tuttavia, mentre i primi due dispositivi mantengono questa direzione, le ventole purtroppo hanno mostrato qualche tallone d'Achille di troppo
ASUS ROG Swift OLED PG34WCDN recensione: il primo QD-OLED RGB da 360 Hz
ASUS ROG Swift OLED PG34WCDN recensione: il primo QD-OLED RGB da 360 Hz
ASUS ROG Swift OLED PG34WCDN è il primo monitor gaming con pannello QD-OLED Gen 5 a layout RGB Stripe Pixel e 360 Hz su 34 pollici: lo abbiamo misurato con sonde colorimetriche e NVIDIA LDAT. Ecco tutti i dati
Recensione Nothing Phone (4a) Pro: finalmente in alluminio, ma dal design sempre unico
Recensione Nothing Phone (4a) Pro: finalmente in alluminio, ma dal design sempre unico
Nothing Phone (4a) Pro cambia pelle: l'alluminio unibody sostituisce la trasparenza integrale, portando una solidità inedita. Sotto il cofano troviamo uno Snapdragon 7 Gen 4 che spinge forte, mentre il display è quasi da top dig amma. Con un teleobiettivo 3.5x e la Glyph Matrix evoluta, è la prova di maturità di Carl Pei. C'è qualche compromesso, ma a 499EUR la sostanza hardware e la sua unicità lo rendono un buon "flagship killer" in salsa 2026
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: 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()
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: 6868
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: 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)
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: 6868
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: 6868
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: 6868
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


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...
Recensione Nothing Phone (4a) Pro: finalmente in alluminio, ma dal design sempre unico Recensione Nothing Phone (4a) Pro: finalmente in...
WoW: Midnight, Blizzard mette il primo, storico mattone per l'housing e molto altro WoW: Midnight, Blizzard mette il primo, storico ...
Ecovacs Goat O1200 LiDAR Pro: la prova del robot tagliaerba con tagliabordi integrato Ecovacs Goat O1200 LiDAR Pro: la prova del robot...
Anthropic ha un'AI che trova falle in Wi...
I 10 migliori sconti Amazon del weekend:...
Con un coupon scendono ancora: le super ...
Minimo storico per Samsung Galaxy S26 Ul...
Si è conclusa la missione lunare ...
EK Waterblock si arrende agli aumenti, i...
Geekbench si aggiorna: tutti i test con ...
Per la prima volta un computer quantisti...
Telecamere Reolink 4K su Amazon: Wi-Fi 6...
Anthropic vuole farsi i chip da sola? Co...
Il fondatore di Framework: il personal c...
JBL Live Flex 3 a 129€ su Amazon: ANC ad...
Come un uomo ha costruito un'azienda da ...
Multe fino a 400 euro anche se hai pagat...
Tapo lancia una valanga di offerte su Am...
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: 09:50.


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