Jak przekazać pole klasy do dekoratora w metodzie klasy jako argument? To, co chcę zrobić, to coś takiego:
class Client(object):
def __init__(self, url):
self.url = url
@check_authorization("some_attr", self.url)
def get(self):
do_work()
Narzeka, że jaźń nie istnieje do przekazania self.url
dekoratorowi. Czy jest na to sposób?
Odpowiedzi:
Tak. Zamiast przekazywać atrybut instancji w czasie definiowania klasy, sprawdź go w czasie wykonywania:
Dekorator przechwytuje argumenty metody; pierwszym argumentem jest instancja, więc odczytuje z niej atrybut. Możesz przekazać nazwę atrybutu jako ciąg do dekoratora i użyć,
getattr
jeśli nie chcesz zakodować na stałe nazwy atrybutu:źródło
źródło
Bardziej zwięzły przykład może wyglądać następująco:
Który wydrukuje:
źródło
Inną opcją byłoby porzucenie cukru syntaktycznego i udekorowanie w
__init__
klasie.który by się wydrukował
źródło
Nie możesz. W
self
treści klasy nie ma, ponieważ nie istnieje instancja. Musiałbyś przekazać go, powiedzmy,str
zawierający nazwę atrybutu, aby wyszukać w instancji, co może następnie wykonać zwrócona funkcja, lub użyć całkowicie innej metody.źródło