In realtà la differenza tra i metodi che aggiungono dinamicamente in fase di esecuzione e tuo esempio è enorme:
- nel tuo caso, è sufficiente allegare una funzione per un oggetto, si può chiamare, naturalmente, ma è non legato, non ha alcuna relazione con l'oggetto stesso (es. non è possibile utilizzare
self
all'interno della funzione)
- quando aggiunto con
MethodType
, si crea un metodo vincolato e si comporta come un metodo Python normale per l'oggetto, tu devono prende l'oggetto appartiene come primo parametro (che è normalmente chiamato self
) e si può accedere all'interno della funzione
Questo esempio mostra la differenza:
def func(obj):
print 'I am called from', obj
class A:
pass
a=A()
a.func=func
a.func()
Ciò non è riuscito con un TypeError
: func() takes exactly 1 argument (0 given)
, che tale codice funziona come previsto:
import types
a.func = types.MethodType(func, a, A)
a.func()
spettacoli I am called from <__main__.A instance at xxx>
.
Questo però non aggiunge un metodo a 'obj'. 'obj.func()' equivale a chiamare semplicemente 'func()'. Un metodo riceve l'istanza come argomento posizionale 1.. È possibile creare un metodo associato con 'func .__ get __ (obj, A)', ma non funzionerebbe neanche, dal momento che 'func' non accetta argomenti. –
La tua funzione 'func' non ha un argomento' self'. Si usa 'type' quando si desidera allegare o sostituire un * metodo * di una classe. Qui si collega semplicemente una * funzione * a una classe. – Cyrbil