Die dynamische Zuweisung Implementierung der Funktion in Python
Will ich weisen Sie eine Implementierung der Funktion dynamisch.
Beginnen wir mit dem folgenden:
class Doer(object):
def __init__(self):
self.name = "Bob"
def doSomething(self):
print "%s got it done" % self.name
def doItBetter(self):
print "Done better"
In anderen Sprachen, die wir machen würde doItBetter eine anonyme Funktion und weisen Sie ihn dem Objekt. Aber keine Unterstützung für anonyme Funktionen in Python. Stattdessen werden wir versuchen, eine aufrufbare Instanz der Klasse, und weisen Sie diese der Klasse:
class Doer(object):
def __init__(self):
self.name = "Bob"
class DoItBetter(object):
def __call__(self):
print "%s got it done better" % self.name
Doer.doSomething = DoItBetter()
doer = Doer()
doer.doSomething()
Dass mir dies:
Traceback (most recent call last): Linie 13, in
Macher.doSomething () - Zeile 9, in nennen
print "%s wurde es besser gemacht" % self.name AttributeError: 'DoItBetter' - Objekt hat kein Attribut 'name'
Schließlich habe ich versucht, die Zuordnung der callable auf die Objekt-Instanz als Attribut und nennen es:
class Doer(object):
def __init__(self):
self.name = "Bob"
class DoItBetter(object):
def __call__(self):
print "%s got it done better" % self.name
doer = Doer()
doer.doSomething = DoItBetter()
doer.doSomething()
Dies funktioniert auch, solange ich das nicht selbst in DoItBetter, aber wenn ich es tun, gibt mir einen Namen Fehler auf self.name
weil es die Verweise auf das callable ist self
, nicht der besitzenden Klasse self
.
So, ich bin auf der Suche nach einem pythonic Möglichkeit zum zuweisen einer anonymen Funktion eine Klasse, Funktion oder Instanz-Methode, wobei die Methode aufgerufen wird, kann die Referenz des Objekts self
.
- Nichts falsch mit dem ersten Ansatz, dass Sie abgelehnt. Warum machst du es so kompliziert?
- Dein Fehler ist wirklich merkwürdig - sind Sie versuchen, führen Sie ein Python-Skript mit einem ruby-interpreter? (Deine Datei heißt
prog.rb
,.py
ist die Python-Datei-Erweiterung). Der Fehler definitiv nicht von der Python -self
ist nicht ein Schlüsselwort in Python. - Mein Fehler - es lief auf eine online-codepad mit ruby Einstellungen - behoben
- du hast Recht - ich war es auch viel zu kompliziert
Du musst angemeldet sein, um einen Kommentar abzugeben.
Dein Erster Ansatz war OK, Sie müssen nur weisen Sie die Funktion zu der Klasse:
Anonyme Funktionen haben nichts mit diesem zu tun (by the way, Python unterstützt die einfache anonyme Funktionen, die aus einzelnen Ausdrücken, siehe
lambda
).yak-Antwort funktioniert großartig, wenn du etwas ändern möchtest, für jede Instanz einer Klasse.
Wenn Sie möchten, ändern Sie die Methode nur für einen bestimmten Instanz des Objekts, und nicht für die gesamte Klasse, würden Sie brauchen, um die Nutzung
MethodType
Typ-Konstruktor zum erstellen einer gebundenen Methode:doer.doSomething = MethodType(doItBetter, doer)
. Eine gute Erklärung der verschiedenen Fälle für Methoden und Funktionen, die in stackoverflow.com/questions/972/...