Grundlegende Verkettung von Methoden

8

Ich fand diese Methode, die in Python verkettet , aber sogar damit konnte ich nicht verstehen Methodenverkettung in Python.

Hier sind die Ziele zwei: Lösen Sie das Coding-Problem und verstehen Sie die Verkettung von Methoden (vorausgesetzt, ich bin immer noch nicht 100% sicher mit callables).

Bis zur Problemdefinition.

Ich möchte eine Klasse mit zwei Methoden: Eine setzt einen Parameter des Objekts = 'line' und die anderen überschreiben 'bar'.

Das habe ich bis jetzt erreicht:

%Vor%

Leider kann ich mit diesem Code mein Ziel erreichen

%Vor%

Aber ich möchte das gleiche Ergebnis erhalten, indem ich diesen Code schreibe

%Vor%

Wie erreiche ich das? Ich denke, es stimmt etwas nicht, wie ich die Methode __call__ definiert habe. Vielen Dank im Voraus für Ihre Hilfe.

    
Pezze 23.01.2017, 23:33
quelle

2 Antworten

18

Die Verkettung von Methoden ist einfach in der Lage, .second_func() zu allem hinzuzufügen, was .first_func() zurückgibt. Es wird relativ einfach implementiert, indem sichergestellt wird, dass alle verkettbaren Methoden self zurückgeben. (Beachten Sie, dass dies nichts mit __call()__ zu tun hat.)

%Vor%

Sie können foo Objekte auf unverkettete Weise verwenden, indem Sie ihre zurückgegebenen Werte ignorieren:

%Vor%

Oder, da jede Funktion nun das Objekt selbst zurückgibt, können Sie operieren direkt auf den zurückgegebenen Wert. Sie können die Methodenverkettung mit diesem äquivalenten Code verwenden:

%Vor%

Oder sogar:

%Vor%

Die Frage, die Aufrufsyntax () loszuwerden, ist ein völlig separates Konzept von der Methodenverkettung. Wenn Sie Ketteneigenschaften wünschen und diese Eigenschaften ihr Objekt mutieren lassen möchten, verwenden Sie @property decorator. (Die Mutation von Objekten über eine Eigenschaft scheint jedoch gefährlich zu sein. Verwenden Sie lieber eine Methode und benennen Sie sie mit einem Verb: .set_line() anstelle von .line .)

%Vor%     
Robᵩ 23.01.2017, 23:45
quelle
3

Verwenden Sie Eigenschaften (Deskriptoren).

%Vor%

Beachten Sie jedoch, dass Sie nichts überschreiben, die Änderung funktioniert nicht inplace (was wohl gut ist, btw). Wie auch immer, dies sieht für die meisten Fälle aus der Praxis nicht wie eine gute Designauswahl aus, da Ihre Methoden irgendwann Argumente benötigen.

    
Eli Korvigo 23.01.2017 23:39
quelle