2012-08-01 12 views
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 Dekoratoren in reinem Python implementieren, wenn ich wollte?Können die staticmethod- und classmethod-Decorators in reinem Python implementiert werden?

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

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

Es ist wieder nicht so, dass ich es tatsächlich in meinen Programmen implementieren möchte; 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. Vielen Dank!

Edit: Danke für die Antwort und für den Verweis auf das Deskriptor-Protokoll! Als ein Mittel, mein Verständnis von Python weiter ausbauen würde Ich mag zwei Dinge fragen:

  • Könnte dies ohne Descriptor-Protokoll erfolgen, beispielsweise durch den __ __ Aufruf spezielle Methode in unseren Klassen zu implementieren?

  • Funktioniert das Deskriptorprotokoll in Python 2.7 und in Python 3.x auf die gleiche Weise?

Danke nochmal!

Antwort

10

Es gibt Beispiele in the docs:

class StaticMethod(object): 
    "Emulate PyStaticMethod_Type() in Objects/funcobject.c" 

    def __init__(self, f): 
     self.f = f 

    def __get__(self, obj, objtype=None): 
     return self.f 

Und:

class ClassMethod(object): 
    "Emulate PyClassMethod_Type() in Objects/funcobject.c" 

    def __init__(self, f): 
     self.f = f 

    def __get__(self, obj, klass=None): 
     if klass is None: 
      klass = type(obj) 
     def newfunc(*args): 
      return self.f(klass, *args) 
     return newfunc 
+0

Ich werde diese Antwort akzeptieren, da es eine gute und vollständige Antwort auf meine ursprüngliche Frage ist. Allerdings werde ich es sehr schätzen, wenn Sie auch auf meine Bearbeitung antworten! Vielen Dank! – Tom

1

Sie sollten JF Sebastian Antwort akzeptieren, da sie Ihre Frage direkt beantwortet, sondern diese Frage bedeutet, dass Sie darüber wissen wollen, das Deskriptor-Protokoll, das Sie über here lesen können, das ist die Sache, die verwendet wird, um diese und andere wichtige Python-Interna zu implementieren (und kann in Ihrem eigenen Code nützlich sein, wenn sparsam verwendet). property, und normale 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.

+0

Danke für den Link und die Erklärung! Bitte sehen Sie meine Bearbeitung. – Tom