Python-Dekoratoren und Klassenvererbung

9

Ich versuche Dekoratoren zu verwenden, um zu verwalten, wie Benutzer auf Ressourcen innerhalb einer Webanwendung (die auf Google App Engine läuft) zugreifen können oder nicht. Beachten Sie, dass ich Nutzern die Anmeldung mit ihren Google-Konten nicht gestatten. Daher ist es nicht möglich, bestimmte Zugriffsrechte für bestimmte Routen in app.yaml festzulegen.

Ich habe folgende Ressourcen verwendet:
- Bruce Eckels Leitfaden für Dekorateure - SO: get-class-in-python-decorator2
- SO: Python-Decorators-and-Vererbung
- SO: get-class-in-python-dekorator

Aber ich bin immer noch ein bisschen verwirrt ...

Hier ist mein Code! Im folgenden Beispiel ist current_user eine @property-Methode, die zur RequestHandler-Klasse gehört. Es gibt ein User (db.model) -Objekt zurück, das im Datenspeicher mit einer Ebene IntProperty ().

gespeichert ist %Vor%

Meine Anwendung verwendet jedoch verschiedene Controller für verschiedene Arten von Ressourcen. Um den @ requiredLevel-Dekorator in allen Unterklassen zu verwenden, muss ich ihn in die Elternklasse (RequestHandler) verschieben:

%Vor%

Meine Idee ist, auf den Dekorator in allen Controller-Unterklassen mit dem folgenden Code zuzugreifen:

%Vor%

Ich glaube, ich habe gerade die Grenze meines Wissens über Dekoratoren und Klassenvererbung erreicht :). Irgendwelche Gedanken?

    
jbmusso 31.07.2010, 16:36
quelle

2 Antworten

4

Dein ursprünglicher Code mit zwei kleinen Verbesserungen sollte ebenfalls funktionieren. Ein klassenbasierter Ansatz scheint für solch einen einfachen Dekorator ziemlich schwer zu sein:

%Vor%

Alternativ könnten Sie stattdessen auch @staticmethod verwenden:

%Vor%

Der Grund dafür, dass der ursprüngliche Code nicht funktionierte, ist, dass requiredLevel als eine Instanzmethode angenommen wurde, die zur Zeit der Klassenerklärung (wenn Sie die anderen Methoden dekorierten) nicht verfügbar sein wird verfügbar von der Klasse-Objekt (Putting der Dekorator auf Ihre RequestHandler-Basisklasse ist eine ausgezeichnete Idee, und der resultierende Dekorator Aufruf ist schön selbstdokumentieren).

Sie könnten daran interessiert sein, die Dokumentation zu @classmethod und @staticmethod .

Auch ein bisschen Boilerplate setze ich gerne in meine Dekorateure:

%Vor%     
David Eyk 27.08.2010, 15:46
quelle
1

Nach dem Durchstöbern von StackOverflow und dem sorgfältigen Lesen von Bruce Eckels Anleitung für Dekorateure denke ich, dass ich eine mögliche Lösung gefunden.

Es beinhaltet die Implementierung des Dekorators als Klasse in der Elternklasse:

%Vor%

Das macht die Arbeit! Die Verwendung von f_args [0] scheint mir ein bisschen dreckig zu sein, ich werde diese Antwort bearbeiten, wenn ich etwas hübscher finde.

Dann können Sie Methoden in Unterklassen wie folgt dekorieren:

%Vor%

Fühlen Sie sich frei, eine Verbesserung zu kommentieren oder vorzuschlagen.

    
jbmusso 31.07.2010 18:31
quelle