2013-02-24 4 views
5

Python können Sie eine vordefinierte Funktion einer Klasse als Attribut, wieZuweisen von Funktionen als Attribute eines Objekts, dann Aufruf ohne das implizite 'Selbst'-Argument?

def fish_slap(fish): 
    # do something 

class dance(object): 
    dance_move=fish_slap 

jedoch zuweisen, wenn wir

d=dance() 
d.dance_move("Halibut") 

sagen wir versuchen, die die folgende Fehlermeldung erhalten

Python scheint dies als eine Objektmethode zu betrachten und das implizierte "self" -Argument zu liefern. Es scheint, ich habe gerade gelernt, dass das Zuweisen einer Funktion als Attribut auf diese Weise der Definition der Funktion direkt innerhalb der Klasse entspricht. Ich kann sehen, dass dies ein nützliches Feature ist.

Allerdings ist dies in diesem Fall nicht das, was ich will. In meiner Anwendung habe ich statistische Modelle, die als verschiedene Klassen kodiert sind, die auch ihre eigenen "Zug" -Methoden haben, um die Modellparameter gegen die gelieferten Daten zu trainieren. Um dies zu tun, soll eine Zielfunktion den Wert der zu liefernden Bedürfnisse minimieren (oder maximieren). Ein Beispiel für eine einfache Zielfunktion ist beispielsweise

wo SciPy als SP importiert wurde. Diese Zielfunktionen sind in einer einzigen .py-Datei definiert und werden in meinem gesamten Code verwendet und existieren natürlich als eigenständige Funktionen und nicht als Klassenmethoden mit dem impliziten Argument 'self'.

Ich mag die gewünschte Zielfunktion als ein Attribut festlegen können, so dass eine nachträgliche Arbeit ein Objektmodell funktioniert diese Funktion nutzt, zum Beispiel

some_model=SomeModel(initial_parameter_values_guess) 
some_model.objective_function = RMSE 
some_model.train(training_data) 
predictions_RMSE = some_model.predict() 
some_mode.objective_function = MAE 
predictions_MAE = some_model.predict() 

In diesem Beispiel scheint, ich konnte nur den Pass Objektive Funktion als Argument zum Trainieren, aber in meiner Anwendung gibt es viel mehr, was man tun möchte, und es scheint sinnvoller zu sein, die objektive Funktion festzulegen/zu erhalten, anstatt sie wiederholt als Argument bereitzustellen.

Es gibt eine Reihe von Problemumgehungen, um dieses grundlegende Verhalten zu erreichen, aber was ist der pythischste Ansatz?

Beachten Sie, dass mein aktueller Code Python2 und Python3 konform ist. Wenn es versionsspezifische Lösungen gibt, weisen Sie bitte darauf hin. Ich laufe mit python2, um matplotlib verwenden zu können, aber ich versuche zu gewährleisten, dass der Code python3-kompatibel ist, abgesehen von diesem Modul.

+0

Warum nicht du änderst einfach 'def fish_slap (fish): 'zu' def fish_slap (self, fish): '? – Blender

+0

@Blender, siehe Absatz, nachdem RMSE definiert wurde. Diese Funktionen sind bereits definiert und werden an vielen anderen Orten als eigenständige Funktionen ohne das Argument 'self' verwendet. – Bogdanovist

Antwort

8

können Sie verwenden, um eine staticmethod

class dance(object): 
    dance_move=staticmethod(fish_slap) 

Beachten Sie, dass Sie nicht brauchen, staticmethod zu verwenden, wenn Sie auf ein Attribut eines Instanz sind die Zuweisung:

>>> def move(): 
...  print "disco party!" 
... 
>>> class dance(object): 
...  dance_move = staticmethod(move) 
... 
>>> d = dance() 
>>> d.dance_move() 
disco party! 
>>> d.break_it_down = move 
>>> d.break_it_down() 
disco party! 
+0

Perfekt. Klar, ich bin immer noch sehr ein Python n00b. – Bogdanovist

Verwandte Themen