2016-05-24 9 views
1

Ich habe einen Code geschrieben, der eine Menge Objekte benötigt, eine Instanzmethode für jede davon verwendet und den von der Instanzmethode zurückgegebenen Wert in eine Liste schreibt.Auswahl der zu verwendenden Instanzmethode

object_list # list of objects 
value_list = [object.method() for obj in object_list] 

Ich brauche diese Struktur in einer Menge von verschiedenen Orten in meinem Code, der einzige Unterschied zwischen ihnen die Instanzmethode seines method ist immer ein anderer.

Es wäre kein Problem, eine mapping approach as explained here zu verwenden, wenn die Methoden funktionieren würden. Etwas Ähnliches könnte mit exec getan werden, aber es ist nicht sehr elegant, und ich bin nicht sicher, wie es in Bezug auf die Rückkehr der Werte funktionieren würde:

def call_method(obj, method_name: str): 
    return exec("obj." + method_name + "()") # returns None 

Gibt es eine elegante Möglichkeit, den Code für dieses Problem Refactoring ?

Antwort

4

vom besten zum schlechtesten, diese Optionen funktionieren:

getattr(obj, method_name)() 
operator.methodcaller(method_name)(obj) # needs import operator 
eval("obj." + method_name + "()") 

Die zweite Version auch wie folgt verwendet werden kann:

value_list = list(map(operator.methodcaller(method_name), object_list)) 
1

Wie wäre:

def call_method(obj, method_name: str): 
    return getattr(obj, method_name)() 

Die getattr Funktion Holen Sie das Attribut und geben Sie die Funktion zurück, das letzte Paar bedeutet Funktionsaufruf.

Verwandte Themen