Können die staticmethod- und classmethod-Decorators in reinem Python implementiert werden?

8

Dies ist eine akademische Frage, mehr als eine praktische Frage. Ich versuche, in die Grundlagen von Python einzutauchen, und ich frage mich: Könnte ich die staticmethod und classmethod Dekoratoren in reinem Python implementieren, wenn ich wollte?

Für staticmethod könnte ich vielleicht einen Verweis auf die ursprüngliche Funktion behalten und es das erste Argument weglassen?

Für classmethod könnte ich vielleicht einen Verweis auf die ursprüngliche Funktion behalten und sie den Typ des ersten Arguments übergeben, anstatt das Argument selbst? (Wie würde ich damit umgehen, dass ich direkt in der Klasse angerufen werde?)

Auch hier möchte ich es nicht in meinen Programmen implementieren. Ich möchte lernen, wie die Sprache daraus funktioniert. Wenn es möglich ist, würde ich Code-Beispiele wirklich schätzen. Wenn nicht, würde ich mich über Erklärungen freuen, warum dies theoretisch nicht möglich ist. Danke!

Bearbeiten: Danke für die Antwort und den Hinweis auf das Deskriptorprotokoll! Um mein Verständnis von Python weiter zu vertiefen, möchte ich zwei weitere Dinge fragen:

  • Könnte dies ohne das descriptor-Protokoll geschehen, zum Beispiel durch die Implementierung der speziellen Methode __ call __ in unseren Klassen?

  • Funktioniert das Deskriptor-Protokoll in Python 2.7 und in Python 3.x genauso?

Nochmals vielen Dank!

    
Tom 01.08.2012, 22:54
quelle

2 Antworten

10

Es gibt Beispiele in den Dokumenten :

%Vor%

Und:

%Vor%     
jfs 01.08.2012, 22:57
quelle
1

Sie sollten JF Sebastians Antwort akzeptieren, da sie Ihre Frage direkt beantwortet, aber wenn Sie diese Frage stellen, wollen Sie etwas über das Deskriptor-Protokoll wissen, das Sie über hier , mit dem diese und andere wichtige Python-Interna implementiert werden (und bei sparsamer Verwendung in Ihrem eigenen Code nützlich sein können). property und reguläre ol 'gebundene Methoden sind andere Dinge, die mit dem Deskriptor-Protokoll geschrieben werden.

Sie sollten es überprüfen, es ist nicht so einfach, wenn Sie zuerst darüber lesen, aber es wird klicken.

    
Julian 01.08.2012 23:43
quelle