2016-05-26 30 views
5

Quali sono i vantaggi dell'utilizzo dei tipi di metodo dal modulo types. È usato per aggiungere metodi all'oggetto. Ma possiamo farlo facilmente senza di essa:Vantaggio dell'uso di methodtype in Python

def func(): 
    print 1 

class A: 
    pass 

obj = A() 
obj.func = func 

Funziona anche se cancelliamo func portata principale del func.

Perché si desidera utilizzare i metodi allora? È solo una convenzione o una buona abitudine di programmazione?

+1

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. –

+0

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

risposta

3

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>.

+0

Quindi, in breve, significa che non sarei in grado di utilizzare gli attributi dell'oggetto su cui ho usato questo. Per esempio se ci fosse un attributo diciamo 'att' nella mia definizione quindi non sarei in grado di usarlo giusto? – Existent

+0

Nel tuo caso nella tua domanda, la funzione è disaccoppiata dall'oggetto. Non c'è modo di accedere all'oggetto dalla funzione perché la funzione non è affatto un metodo. – mguijarr

+0

@ABHI no, è possibile accedere a 'att' da qualsiasi luogo, ma è necessaria un'istanza della classe per accedervi (ad esempio' att' da solo non significa nulla, è necessario 'obj.att'). I metodi definiti normalmente (e quindi vincolati) ottengono il 'self'argument che è l'istanza a cui è legato il metodo e quindi hanno un modo semplice per arrivare al' att' appropriato. –

3

Un uso comune di types.MethodType sta verificando se alcuni oggetti sono un metodo. Per esempio:

>>> import types 
>>> class A(object): 
...  def method(self): 
...   pass 
... 
>>> isinstance(A().method, types.MethodType) 
True 
>>> def nonmethod(): 
...  pass 
... 
>>> isinstance(nonmethod, types.MethodType) 
False 

Si noti che nel tuo esempio isinstance(obj.func, types.MethodType) rendimenti False. Immagina di aver definito un metodo meth nella classe A. isinstance(obj.meth, types.MethodType) restituirebbe True.