Dynamischer Methodenaufruf In Python 2.7 mit Strings von Methodennamen

7

Ich habe ein Tupel, das die Methoden einer Klasse wie folgt auflistet:

%Vor%

und so weiter ..

Jetzt muss ich diese Methoden basierend auf einer benutzerdefinierten Auswahl dynamisch aufrufen. Die Methoden sollen auf Basis des Indexes aufgerufen werden. Wenn also ein Benutzer '0' auswählt, wird methA aufgerufen, wenn '5', methF aufgerufen wird.

Meine Methode hierfür ist wie folgt:

%Vor%

Ich habe es geschafft, etwas mit eval zu erarbeiten, aber es ergibt Fehler und ist überhaupt nicht elegant.

    
oat 18.07.2013, 21:54
quelle

1 Antwort

19

Wenn Sie eine Methode für ein Objekt (einschließlich importierter Module) aufrufen, können Sie Folgendes verwenden:

%Vor%

Wenn Sie eine Funktion im aktuellen Modul aufrufen müssen

%Vor%

Dabei steht args für eine Liste oder ein Tupel von zu sendenden Argumenten, oder Sie können sie einfach wie jede andere Funktion im Aufruf auflisten. Da Sie in einer Methode sind, die versucht, eine andere Methode für dasselbe Objekt aufzurufen, verwenden Sie die erste mit self anstelle von obj

getattr nimmt ein Objekt und eine Zeichenfolge und führt eine Attributsuche im Objekt aus. Gibt das Attribut zurück, wenn es existiert. obj.x und getattr(obj, 'x') erreichen das gleiche Ergebnis. Es gibt auch die Funktionen setattr , hasattr und delattr , wenn Sie diese Art der Reflexion genauer betrachten möchten.


Ein völlig alternativer Ansatz:
Nachdem ich bemerkt habe, wie viel Aufmerksamkeit diese Antwort erhalten hat, werde ich einen anderen Ansatz vorschlagen, was Sie tun. Ich nehme an, einige Methoden existieren

%Vor%

Damit jede Methode einer Zahl entspricht (Auswahl), erstelle ich ein Wörterbuch, das Zahlen den Methoden selbst zuordnet

%Vor%

Gegeben würde id_to_method[0]() methA aufrufen. Es besteht aus zwei Teilen, erstens ist id_to_method[0] , das das Funktionsobjekt aus dem Wörterbuch holt, dann ruft es () auf. Ich könnte auch Argument id_to_method[0]("whatever", "args", "I", "want) übergeben In deinem echten Code hättest du wahrscheinlich so etwas wie

%Vor%     
Ryan Haining 18.07.2013, 21:59
quelle

Tags und Links