So erstellen Sie Funktionen auf Modulebene aus Methoden in einer Klasse dynamisch

8

Ich versuche, Funktionen auf Modulebene dynamisch aus den Methoden einer Klasse zu erstellen. Daher möchte ich für jede Methode in einer Klasse eine Funktion mit demselben Namen erstellen, die eine Instanz der Klasse erstellt und dann die Methode aufruft.

Der Grund dafür ist, dass ich einen objektorientierten Ansatz zum Erstellen von Fabric-Dateien verwenden kann. Da Fabric Funktionen auf Modulebene, aber nicht Methoden einer Klasse aufruft, ist dies mein Workaround.

Ich habe die folgenden Links benutzt, um mich zu starten

Und ich habe den folgenden Code erstellt

%Vor%

Und ich bekomme den folgenden Fehler

%Vor%

Es scheint den Verweis auf die Funktion wiederzuverwenden? Irgendwelche Ideen?

UPDATE: Hier ist der Arbeitscode mit Ned Batchelders Fix

%Vor%

UPDATE 2: Hier ist mein Blogbeitrag zum Thema: Ссылка

    
saltycrane 08.09.2010, 02:45
quelle

2 Antworten

9

Sie überdenken Ihre Lösung. Ändere das Ende von fabric_class_to_function_magic auf das folgende:

%Vor%

und es funktioniert gut. Sie brauchen kein neues Funktionsobjekt zu erstellen, Sie haben bereits eines, das von getattr in Ihrem Objekt zurückgegeben wird. Die von getattr zurückgegebene gebundene Methode ist eine aufrufbare Sache. Ordnen Sie es einfach Ihrem Modul-Attribut zu, und Sie können loslegen.

    
Ned Batchelder 08.09.2010, 03:12
quelle
1

Eigentlich ist Ihr Code richtig, aber wenn return func (* args, ** kwargs) ausgeführt wird, übergeben args leere Tupel wie () und es gibt keine Parameter in Ihrer Methode2, daher wird eine solche Ausnahme ausgelöst,

Eine schnelle Lösung für Ihr Problem wäre wie

%Vor%     
shahjapan 08.09.2010 03:04
quelle

Tags und Links