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
InformationsquelleAutor Yarin | 2012-04-29
Schreibe einen Kommentar