2016-05-13 7 views
0

Ich lerne Flasche, und jetzt lese ich den Flaschencode.
Ich komme in einen Block, den ich nicht vollständig verstehen kann.Wie behandelt Lambda in Python 3 die Argument-Referenz?

def implements_to_string(cls): 
    cls.__unicode__ = cls.__str__ 
    cls.__str__ = lambda x: x.__unicode__().encode('utf-8') 
    return cls 

@implements_to_string 
class Test(object): 
    def __init__ (self): 
     pass 

test = Test() 
print(test.__str__) 
print(test.__str__()) 

Der erste Druck zeigt die Lambda-Methode als:

<bound method Test.<lambda> of <__main__.Test object at 0x7f98d70d1210>> 

Die zweite:

<__main__.Test object at 0x7fcc4394d210> 

Wenn also funktioniert die x in dem Lambda in func implements_to_string das Objekt cls werden?
Ist es nur ein innerer Mechanismus, an den ich mich jetzt nur erinnern muss?
Oder gibt es noch etwas anderes zu wissen?

+0

Der Parameter 'x' beim Aufruf der Lambda-Funktion ist nicht die' Test'-Klasse, sondern die Instanz 'test'. Python ruft instancemethods mit der Instanz ('self') als erstes Argument auf. – resi

+0

@resi Vielen Dank. Ich verstehe jetzt, dass die Lambda-Funktion in einer Klassenumgebung den ersten Parameter als "self" annehmen wird. – John

Antwort

0

Aus der Dokumentation:

Kleine anonyme Funktionen können mit dem lambda Schlüsselwort erstellt werden. Diese Funktion gibt die Summe ihrer zwei Argumente zurück: lambda a, b: a+b. Lambda-Funktionen können überall dort eingesetzt werden, wo Funktionsobjekte benötigt werden. Sie sind syntaktisch auf einen einzelnen Ausdruck beschränkt. Semantisch sind sie nur syntaktischer Zucker für eine normale Funktionsdefinition.

Ihre Implementierung von implements_to_string ähnlich ist, was ich habe hier:

def implements_to_string(cls): 
    cls.__unicode__ = cls.__str__ 

    def lambda_func(self): 
     return self.__unicode__().encode('utf-8') 

    cls.__str__ = lambda_func 
    return cls 

Wenn also funktioniert die x in dem Lambda in func implements_to_string das Objekt cls werden?

Wenn Sie print(test.__str__) verwenden, drucken Sie die Methode selbst und ihre Darstellung wird gedruckt.

Wenn Sie jedoch print(test.__str__()) verwenden, führen Sie zuerst die Funktion aus und drucken, was von der Methode zurückgegeben wird.

+0

Sie können den konventionellen 'self' Variablennamen anstelle von' x' im mitgelieferten Code-Snippet verwenden, um es noch deutlicher zu machen es geht voran. –

+0

Ich finde jetzt heraus, dass der erste Parameter in Lambda unter Klassenumständen als "selbst" wie in normaler Funktion behandelt wird. Danke @AKS und @Martin. – John

+0

Ich habe nur 'x' verwendet, um es näher an dem zu halten, was der Benutzer im Snippet hat. – AKS