2011-08-20 25 views
8

Come è possibile eseguire un metodo assegnandone il nome, da un altro metodo che si trova nella stessa classe con il metodo chiamato? Mi piace questo:nome metodo variabile python

class Class1: 
    def __init__(self): 
     pass 
    def func1(self, arg1): 
     # some code 
    def func2(self): 
     function = getattr(sys.modules[__name__], "func1") # apparently this does not work 

Qualche suggerimento?

risposta

9

come su getattr(self, "func1")? Inoltre, evitare di utilizzare la funzione di nome

Ad esempio:

>>> class C: 
... def f1(self, arg1): print arg1 
... def f2(self): return getattr(self, "f1") 
... 
>>> x=C() 
>>> x.f2()(1) 
1 
+0

Non c'è motivo di usare 'getattr' se si conosce il metodo che si desidera - basta afferrarlo. –

5

si dovrebbe ottenere l'attributo dalla classe, non il modulo.

def func2(self): 
    method = getattr(self, "func1") 
    method("arg") 

Ma si dovrebbe anche verificare che sia chiamabile.

if callable(method): 
    method("arg") 

Questo eviterà di chiamare qualcosa che non ti aspetti di ottenere. Potresti voler aumentare la tua eccezione qui se non è chiamabile.

+0

grazie sta funzionando – Shaokan

+0

'getattr' non è necessario quando si conosce il nome del metodo. Inoltre, perché controllare se è callable? O lo è (e dovrebbe essere se si tratta di un metodo), o solleverà un'eccezione - che è il modo corretto di gestire un errore. –

+2

@Ethan presumibilmente il nome sarebbe in realtà una variabile, e questo è solo un esempio. Il controllo callable evita errori, in una riga di codice, e l'intento è più chiaro, dato che getattr può restituire qualsiasi tipo di attributo e non solo i metodi. – Keith

Problemi correlati