2011-09-29 1 views
1

Étant donné un objet Foo, qui a un ensemble de méthodes Bar, Baz, Quux et Close.Citation d'une fonction Python pour l'appliquer plus tard

Je veux conclure des appels en Foo comme suit

def wrapper(method_symbol, *args): 
    object = Foo() 
    apply(object.method_symbol, args) 
    object.Close() 

Alors plus tard, je peux appeler wrapper(Bar, MySweetArgs) et ont wrapper expédier correctement.

Il est évident que dans Lisp ce serait simple, il suffit de QUOTE method_symbol et vous allez loin.

L'objectif est d'allouer/libérer correctement les ressources de manière efficace. Je préférerais ne pas emballer tout Foo avec une classe SafeFoo.

+0

Qu'est-ce que est une "mode texte efficace"? – mikerobi

+0

@mike: Je ne veux pas avoir à écrire beaucoup de code standard. –

+0

@agf: C'est juste une méthode sur Foo. –

Répondre

-1

Si method_symbol est le nom de la chaîne, puis:

Foo.__dict__[method_symbol](*args) 

probablement le faire.

+1

Pas si c'est une méthode d'instance. – agf

+0

Vraiment, vous devriez pousser obj sur le début des arguments pour agir en tant que soi. La réponse de sth est meilleure. –

4

Si vous voulez appeler la méthode par son nom, la fonction wrapper pourrait ressembler à ceci:

def wrapper(method_symbol, *args): 
    obj = Foo() 
    getattr(obj, method_symbol)(*args) 
    obj.Close() 

wrapper('Bar', 1, 2, 3) 

Vous pouvez également utiliser la méthode directement, au lieu de son nom:

def wrapper(method, *args): 
    obj = Foo() 
    method(obj, *args) 
    obj.Close() 

wrapper(Foo.Bar, 1, 2, 3) 
Questions connexes