Wie übergebe ich ein Klassenfeld als Argument an einen Dekorateur für eine Klassenmethode? Was ich tun möchte, ist so etwas wie:
class Client(object):
def __init__(self, url):
self.url = url
@check_authorization("some_attr", self.url)
def get(self):
do_work()
Es beschwert sich, dass es kein Selbst gibt, um es self.url
an den Dekorateur weiterzugeben. Gibt es einen Weg, dies zu umgehen?
python
python-decorators
Kennzeichen
quelle
quelle
Antworten:
Ja. Anstatt das Instanzattribut zur Zeit der Klassendefinition zu übergeben, überprüfen Sie es zur Laufzeit:
Der Dekorateur fängt die Methodenargumente ab. Das erste Argument ist die Instanz, also liest es das Attribut davon ab. Sie können den Attributnamen als Zeichenfolge an den Dekorateur übergeben und verwenden,
getattr
wenn Sie den Attributnamen nicht fest codieren möchten:quelle
quelle
Ein prägnanteres Beispiel könnte sein:
Welches wird gedruckt:
quelle
Eine andere Möglichkeit wäre, den syntaktischen Zucker aufzugeben und in
__init__
der Klasse zu dekorieren .was würde drucken
quelle
Das kannst du nicht. Es gibt keine
self
im Klassenkörper, da keine Instanz existiert. Sie müssten es beispielsweise übergeben,str
das den Attributnamen enthält, um nach der Instanz zu suchen, was die zurückgegebene Funktion dann tun kann, oder eine ganz andere Methode verwenden.quelle