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.
Warum nicht du änderst einfach 'def fish_slap (fish): 'zu' def fish_slap (self, fish): '? – Blender
@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