View Single Post
Old 23-02-2012, 08:14   #4
cdimauro
Senior Member
 
L'Avatar di cdimauro
 
Iscritto dal: Jan 2002
Città: Germania
Messaggi: 26110
Ti anticipo subito che è impossibile, perché in Python non esiste l'operatore di assegnamento, ma l'istruzione di assegnamento, che non è soggetta a overloading.

In buona sostanza, se scrivi:
Codice:
Lista = [1, 2, 3]
AltraLista = Lista
Sia Lista che AltraLista puntano allo stesso oggetto, e non c'è verso di intercettare l'azione di assegnazione della seconda istruzione per fargli fare qualcos'altro.

Ti riporto cosa succede a basso livello con Python con quel codice:
Codice:
Python 2.6.6 (r266:84297, Aug 24 2010, 18:46:32) [MSC v.1500 32 bit (Intel)] on win32
Type "help", "copyright", "credits" or "license" for more information.
>>> import dis
>>> def f():
...   Lista = [1, 2, 3]
...   AltraLista = Lista
...
>>> dis.dis(f)
  2           0 LOAD_CONST               1 (1)
              3 LOAD_CONST               2 (2)
              6 LOAD_CONST               3 (3)
              9 BUILD_LIST               3
             12 STORE_FAST               0 (Lista)

  3          15 LOAD_FAST                0 (Lista)
             18 STORE_FAST               1 (AltraLista)
             21 LOAD_CONST               0 (None)
             24 RETURN_VALUE
Questo è il disassemblato di quelle 2 istruzioni presenti nella funzione f.

Dall'offset 0 a 9 viene costruita la lista.
12 la memorizza nella variabile Lista (da notare l'istruzione usata: STORE_FAST).

Questo rappresenta la prima istruzione.

15 e 18 rappresentano, invece, la seconda istruzione, che si occupano rispettivamente di prelevare il valore da Lista e memorizzarlo in AltraLista.

E' un meccanismo di basso livello (una banale copia, alla fine) che Python utilizza per QUALUNQUE oggetto (valore) manipoli, siano esse lista, tuple, numeri, o quant'altro.

Ed è un meccanismo che, come puoi capire, non fa scattare alcun metodo speciale (tipo __getattr__, __setattr__, ecc. per intenderci) che sia eventualmente possibile intercettare.

Spero sia chiaro. Se hai ancora dubbi, chiedi pure.

P.S. 21 e 24 sono istruzioni di chiusura della funzione, perché Python restituisce sempre un valore, anche se non lo specifichi appositamente. Ignorale.
__________________
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