Machen Wörterbuchfunktion verhalten sich wie Klassenmethode

Ich habe ein Wörterbuch von Methoden:

def name(self): print self.name def age(self): print self.age display = { 'name': name, 'age': age } 

Und ich habe eine Klasse Person wo ich display['name']() und display['age']() als Methoden arbeiten soll:

 class Person: def __init__(self): self.name = 'Bob' self.age = 22 self.showName = display['name'] self.showAge = display['age'] person = Person() 

Das Problem ist, dass wenn ich person.showName() Ich bekomme den Fehler

TypeError: showName () nimmt genau 1 Argument (0 gegeben)

Wie kann ich die Funktion showName wie eine Methode handeln und implizit self als das erste Argument übergeben?

4 Solutions collect form web for “Machen Wörterbuchfunktion verhalten sich wie Klassenmethode”

Einfache Möglichkeit ist es, Definitionen Ihrer Funktionen außerhalb von __init__ :

 >>> class Person: ... showName = display['name'] ... showAge = display['age'] ... def __init__(self): ... self.name = 'Bob' ... self.age = 22 ... >>> Person().showAge() 22 

Härtere Weise ist zu verstehen, warum dies geschieht und verwenden MethodType :

 >>> class Person: ... def __init__(self): ... self.name = 'Bob' ... self.age = 22 ... self.showName = types.MethodType(display['name'], self) ... self.showAge = types.MethodType(display['age'], self) ... >>> Person().showAge() 22 

Kurz gesagt, eine Funktion sollte eine Methode sein, um ein bisschen etwas zu bedrohen, während Sie object.attribute Lookup ausführen. Diese Bedrohung beinhaltet auch das Übergeben von self , die Ihre Funktionen erwarten. MethodType nimmt Funktion und bindet es an ein Objekt und schafft so eine Methode.

Erstes Beispiel funktioniert, da Funktionen, die zusammen mit der Klassendefinition definiert werden, automatisch als Methoden bedroht werden.

 from functools import partial class Person: def __init__(self): self.showName = partial(display['name'], self=self) 

partial ermöglicht eine bessere Unterstützung für die Übergabe von Argumenten an die eingekapselte Funktion als lambda , wenn Sie in der Zukunft mehr Argumente benötigen werden.

Du kannst so etwas wie:

 self.showName = lambda : display['name'](self) 

Mach das:

 display['name']() 

Sollte arbeiten.

Python ist die beste Programmiersprache der Welt.