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.